IT/알고리즘 24

[BOJ] 나이순 정렬 10814.java

준비 겸, JAVA Stream에 익숙해지기 위해. 문제 https://www.acmicpc.net/problem/10814 10814번: 나이순 정렬 온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 www.acmicpc.net 나이 - 이름으로 입력 받았을 때, 나이 순으로 정렬하고, 같은 경우 입력 순서대로 정렬한다. 해설 및 코드 public class 나이순정렬 { public static class User{ int age; String name; User(int a, String n){ this.age = a; this.name = n; } public int..

IT/알고리즘 2022.05.25

[프로그래머스] 종이접기 - Cos Pro 1급

문제 https://programmers.co.kr/learn/courses/11132/lessons/71152 COS Pro 1급 Java 모의고사 - 종이접기 [[1, 4, 16, 1], [20, 5, 15, 8], [6, 13, 36, 14], [20, 7, 19, 15]] 55 programmers.co.kr 1. 4 x 4 크기인 정사각형 종이가 1 x 1 크기인 격자 칸으로 나누어져 있음 2. 이 종이를 가로축 혹은 세로축에 평행한 격자 선을 따라 한 번 접었을 때, 만나는 격자 칸에 적힌 숫자의 합이 최대일 때 3. 종이를 접을 때는 만나는 격자 칸이 정확히 일치 예를 들어 다음과 같이 4 x 4 크기인 종이가 있을 때, - 종이는 점선 중 하나를 따라서 접을 수 있음 - 붉은색 점선을 따라..

IT/알고리즘 2022.04.20

[BOJ] 순회강연 2109.java

문제 백준의 과제 13904 문제와 같은 문제이다. 점수와 날짜만 서로 바꿔서 입력된다. 해당 문제는 하루에 한 개의 강연만 할 수 있을 때, 가장 최대로 얻을 수 있는 p(강연료)를 구하는 문제이다. 해설 및 코드 package BAEKJOON; import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; import java.util.TreeSet; public class 순회강연_2109 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int[][] arr = new int[N][2];..

IT/알고리즘 2021.06.21

[BOJ] 가장 긴 증가하는 부분수열2 12015.java

문제 LIS라는 대표적인 알고리즘 문제 중 하나이다. 가장 긴 증가하는 부분 수열의 길이를 리턴한다. 가장 긴 증가하는 부분수열 11053 문제는 O(n^2)으로 문제를 풀 수 있지만, 해당 문제는 O(nlogn)의 시간으로 코드를 짜야한다. https://jason9319.tistory.com/113 이 블로그에 설명이 잘 나와있지만, 공부하는 마음으로 작성한다. 해설 및 코드 - Lower Bound는 O(logn)의 시간을 소모한다. 이러한 이분탐색의 일종인 Lower Bound를 이용하여 O(nlogn)의 시간으로 해결한다. package BAEKJOON; import java.util.ArrayList; import java.util.Scanner; public class 가장긴증가하는부분수열2..

IT/알고리즘 2021.06.21

[BOJ] 합이0 3151.java

문제 - N개의 숫자(-10000~10000)가 주어질 때, 세 개의 숫자 합이 0이되는 경우의 수 해설 및 코드 package BAEKJOON; import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class 합이0_3151 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); // 2 -5 2 3 -4 7 -4 0 1 -6 int[] arr = new int[N]; // -7 -6 -5 -4 ArrayList minus = new ArrayList(); // 1 2 2 3 7..

IT/알고리즘 2021.06.01

[BOJ] 시리얼번호 1431.java

문제 - 문제에 나온 순서대로 정렬해서 출력하면 된다. - 정렬 및 구현 문제 해설 및 코드 package BAEKJOON; import java.util.*; public class 시리얼번호_1431 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); PriorityQueue pq = new PriorityQueue(new Comparator() { @Override public int compare(String o1, String o2) { // TODO Auto-generated method stub if (o1.length() == o2.length()) { int ..

IT/알고리즘 2021.05.18

[BOJ] 배열돌리기1_16926.java

문제 - 구현의 기본적인 문제 - 반시계방향으로 배열의 각 원소를 하나씩 옮긴다. - R번 회전한다. 해설 및 코드 배열 회전 문제를 구현할 때, 그냥 보이는 대로 푸는 경우가 많다. -> 복잡성이 증가한다. 내가 구현한 배열 회전은 2개의 temp를 임시저장해서 사용했다. 완전히 같은 문제는 아니지만, 배열 돌리는 문제를 부딪치면서 푼 방법이다. int stx = queries[i][0]; int sty = queries[i][1]; int min = Integer.MAX_VALUE; int endx = queries[i][2]; int endy = queries[i][3]; int back = map[stx][endy]; for (int j = endy; j > sty; j--) { min = Mat..

IT/알고리즘 2021.04.09

[알고리즘 이론] 카데인 알고리즘(Kadane's Alogrithm)

카데인 알고리즘이란? 참고: sustainable-dev.tistory.com/23 DP 기법 중 하나이다. 앞의 값을 이용해 뒤의 값을 구할 수 있다. 최대 부분 합을 구할 때 사용한다. 1차원 배열에서 부분 배열 중 최대 합을 구하면된다. 핵심코드 for (int i = 0; i < N; i++) { sum = Math.max(arr[i], sum + arr[i]); max = Math.max(sum, max); } A[5]까지 부분합은 A[4]의 부분합을 통해서 구할 수 있다. A[4]의 Sum을 보면, [-1, 3, 0, 1, -1]이라는 값이 있다. 그 다음 A[5]의 Sum을 보면 [1, 5, 2, 3, 1]이 있는데, 이 값들은 이전 A[4]의 배열에서 A[5]의 값인 2를 더해준 값이다. ..

IT/알고리즘 2021.03.23

[BOJ] 소년점프 16469.java

문제 www.acmicpc.net/problem/16469 굉장히 괜찮았던 문제이다. 어려운 문제는 아니었는데, 접근하는 방법을 조금 다르게 생각해봐야하는 좋은 문제였다. - 첫 줄에 주어진 R, C로 만들어진 map - q1, q2, q3 3명이 동시에 한 지점에 도착할 때의 최단 시간을 찾으면 된다. 해설 및 코드 코드 자체는 어렵지 않게 풀어서, 큰 주석을 붙이지는 않았다. BFS로 문제를 풀었는데, Deepening을 사용해서 한 번에 이동이 가능한 size만큼 체크를 해줬다. 어디든 갈 수 있기 때문에, 방문 할 수 있으면 무조건 True로 만들어줬다. 이후, 전체 map을 탐색해서 세 check 배열이 모두 True인 구간이 있으면 개수를 센 후에 종료해줬다. 최단만 찾으면 되니까! packa..

IT/알고리즘 2021.03.20

[이코테BOJ] 플로이드 11404.java

문제 www.acmicpc.net/problem/11404 - N개의 지점과 M개의 간선이 주어진다. - 가중치를 가진 단방향 그래프 - 입/출력의 시작을 1로 봐야한다. 해설 및 코드 - 플로이드와샬 알고리즘으로 쉽게 풀 수 있다. - 개인적으로 골드4 정도는 아닌 듯... - 플로이드와샬 알고리즘을 할 때, 항상 배열의 초기화를 987654321로 한다. Intger. MaxValue를 쓰게 되면 + 계산 시 -가 나와서 최소 값을 제대로 찾지 못하기 때문이다. package 백준; import java.util.Arrays; import java.util.Scanner; public class 플로이드_11404 { public static void main(String[] args) { Scann..

IT/알고리즘 2021.03.20