본문 바로가기

Algorithm/[BOJ] - JAVA

(173)
[백준] 18870 : 좌표 압축 JAVA 풀이 N개의 숫자 중 자신보다 작은 숫자의 개수를 세고 출력하기만 하면 되나....했지만 잘보면 처음 입력되는 숫자 N개의 순서대로 출력해야 한다는 점이 좀 까다로웠다. N개의 숫자를 배열 arr에 저장하고, arr에서 중복되는 값을 제외하고 그걸 정렬한 값을 담은 새로운 배열 tmp를 만든 뒤에 두 배열의 값을 비교하면서 일치할 때마다 tmp의 인덱스(자기보다 작은 수의 개수)를 출력하려고 했지만 예상대로 시간초과가 됐다. 이걸 어쩌나 고민하던 중 해쉬맵을 알게 됐다. 해쉬맵은 키값과 데이터로 이루어져서 키값은 중복될 수 없지만 데이터는 중복될 수 있다. 이를 이용해서 다음과 같은 순서로 코드를 짰다. 1. arr라는 배열에 N개의 숫자를 저장한다. 2. tmp라는 배열에 arr배열을 복사해둔다. (처음 입..
[백준] 10814 : 나이순 정렬 JAVA 풀이 1. 회원 수 N을 입력받는다. 2. 공백 하나를 두고 나이와 이름이 입력되는데, 이를 2차원 스트링 배열에 저장한다. 3. 나이순으로 정렬한다. -> 나이가 같을 때의 조건을 추가로 정해두지 않으면 알아서 입력된 순서로 정렬된다. 4. 정렬된 2차원 배열을 출력한다. import java.io.IOException; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; public class Main{ public static void main(String[] args) throws IOException{ BufferedReader br..
[백준] 1181 : 단어 정렬 JAVA 풀이 1. 단어의 개수 N을 입력받는다. 2. N개의 단어를 입력받고, 그 단어가 처음 입력된 것이라면 ArrayList에 추가한다. -> 처음엔 일반 배열을 생성하고, 처음 입력된 단어일 때만 배열에 저장하려고 했다. 그러나 for문으로 하다보니 배열의 중간이 비는 상황이 발생해서 ArrayList로 변경했다. 3. 길이가 짧은 순으로 정렬하고 길이가 같으면 사전 순으로 정렬한다. import java.io.IOException; import java.io.InputStreamReader; import java.io.BufferedReader; import java.util.ArrayList; public class Main{ public static void main(String[] args)throws ..
[백준] 11651 : 좌표 정렬하기 2 JAVA 풀이 이전 문제에서 x와 y만 바뀐 문제다. y값을 기준으로 정렬하되 y값이 같다면 w값의 오름차순으로 정렬하면 된다. import java.io.IOException; import java.io.InputStreamReader; import java.io.BufferedReader; import java.util.StringTokenizer; import java.util.Arrays; public class Main{ public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(br.re..
[백준] 11650 : 좌표 정렬하기 JAVA 풀이 1.점의 개수 N을 입력받는다. 2. x좌표와 y좌표를 저장할 2차원 배열 arr[N][2]를 생성한다. 3. x좌표와 y좌표를 입력받아 배열에 저장한다. 4. x좌표의 오름차순으로 배열을 정렬하는데 x좌표가 같을 때는 y좌표의 오름차순으로 정렬한다. import java.io.IOException; import java.io.InputStreamReader; import java.io.BufferedReader; import java.util.StringTokenizer; import java.util.Arrays; public class Main{ public static void main(String[] args) throws IOException { BufferedReader br = new Bu..
[백준] 1427 : 소트인사이드 JAVA 풀이 이번 문제는 아주 간단했다!! 1. N을 입력받는다. 2. N의 각 자리수를 쪼개서 리스트에 넣는다. 3. 리스트를 내림차순으로 정렬한다. import java.io.IOException; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; public class Main{ public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // N의 각 자리수를 저장할 ..
[백준] 2108 : 통계학 JAVA 풀이 다들 그랬겠지만 나역시도 최빈값을 구하는 게 제일 어려웠다. 빈도수가 가장 큰 걸 찾는 건 쉬운데 두 번째로 작은 값은 어떻게 찾나 엄청 고민했다. 다 풀고나서 보니 flag 하나만 추가하면 풀 수 있도록 저런 조건을 둔 것 같다. 1. 입력될 숫자의 개수 N을 입력받는다. 2. N개의 숫자를 입력받아 배열에 저장하고, 평균을 구할 때 사용할 누적합을 구한다. 3. N개의 숫자가 저장된 배열을 정렬한다. 4. 숫자의 빈도수를 셀 cnt, 빈도수 중 최댓값을 저장할 max, 최빈값을 저장할 mode, 처음 등장한 최빈값인지 판단하는 boolean형 flag를 생성한다. 5. 정렬된 배열을 순회하면서 다음 숫자가 자신과 같을 때마다 cnt를 증가시킨다. 6. cnt가 max보다 커지면 max와 mode값을 ..
[백준] 10989 : 수 정렬하기 3 JAVA 풀이 카운팅정렬을 구현하는 방법은 다음과 같다. 1. 입력받을 숫자의 개수를 N이라고 했을 때, 그 숫자들을 저장할 배열 arr[N]와 정렬된 값을 저장할 result[N]을 생성한다. 2. arr에 저장된 숫자들의 출현빈도를 저장할 배열을 생성하는데 이때 그 배열의 크기는 입력되는 숫자의 범위로 한다. 그 범위를 10000이하의 자연수라고 하면 count[10001]을 생성한다. 3. arr를 순회하면서 arr에 저장된 숫자의 출현빈도를 count의 그 숫자를 인덱스로 하는 곳에 저장한다. count[arr[i]]++; 4. count 배열을 누적합으로 바꾼다. i=1부터 count.length-1까지 count[i] = count[i] + count[i-1]; 이를 수행하고 난 뒤의 count[0]이 3이..