반응형
문제 풀이
유의사항
1. 각 수는 1,000,000,000의 크기로 문자열을 사용하여 이어 붙여야 한다.
(자바의 문자열은 compareTo() 함수를 사용하여 비교가 가능하다.)
2. 숫자가 중복될 수 있으므로 가장 큰 수를 찾아 반복할때 유의해야한다.
정렬만 잘하면 쉽게 해결할 수 있는 문제이다. 두 수를 붙였을때 어떤 숫자가 더 큰지를 기준으로 정렬을 해야한다.
Arrays.sort(arr, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));
위의 정렬식을 보면 o2 + o1과 o1 + o2를 비교하여 정렬을 수행한다.
이어 붙였을때 가장 큰 수를 찾고, 반복해야할 수를 찾아 순서대로 합치는것으로 정답을 찾을 수 있다.
문제의 예제 3을 예시로 들면 o1을 1, o2를 10이라 했을 때, o2 + o1 = 101, o1 + o2 = 110이다. 이 경우 110이 더 큼으로 1이 앞에 오게 되고 다음으로 10이 온다. 정렬을 하면 1, 10, 100 순으로 정렬된다.
입력을 받을때 max로 가장 큰 수를 저장한다. K보다 N이 큰 경우 반복할 수 이다.
이제 정렬된 문자열 배열을 순회하며 이어 붙인다.
입력에서 찾은 가장 큰수의 경우는 K - N만큼 반복하여 이어 붙인다. 이 때 중복된 수가 가장 큰 수가 될 수 있으므로 flag를 두어 검사한다.
소스코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int K = Integer.parseInt(st.nextToken());
int N = Integer.parseInt(st.nextToken());
String[] arr = new String[K];
int max = 0;
for (int i = 0; i < K; i++) {
arr[i] = br.readLine();
max = Math.max(max, Integer.parseInt(arr[i]));
}
Arrays.sort(arr, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));
boolean flag = true;
StringBuilder answer = new StringBuilder();
for (String t : arr) {
answer.append(t);
if (max == Integer.parseInt(t) && flag) {
for (int i = K; i < N; i++) {
answer.append(t);
flag = false;
}
}
}
System.out.println(answer);
}
}
반응형
'알고리즘(Algorithm) > 백준(Baekjoon)' 카테고리의 다른 글
[백준 Baekjoon] 21610번 마법사 상어와 비바라기 - JAVA (0) | 2021.12.19 |
---|---|
[백준 Baekjoon] 17142번 연구소 3 - JAVA (0) | 2021.12.17 |
[백준 Baekjoon] 1826번 연료 채우기 - JAVA (0) | 2021.12.15 |
[백준 Baekjoon] 2641번 다각형그리기 - JAVA (0) | 2021.12.14 |
[백준 Baekjoon] 2659번 십자카드 문제 - JAVA (0) | 2021.12.13 |