알고리즘(백준 등) 공부
SWEA 16003. 화면 캡쳐
posite
2026. 5. 5. 15:02
이미지 번호를 1부터 n까지 정렬할 때 숫자 정렬이 아닌 문자열 정렬을 따라서 정렬하여 min(n, 50)개의 파일명을 출력하는 문제이다.
ex) n = 11 일때 1 10 11 2 3 4 5 6 7 8 9 로 출력하면 된다.
백트래킹을 적용하여 문자열에 0부터 9까지 더하면서 빈 공간 혹은 0이 아닌 숫자이면서 n보다 작거나 같은 수 min(n, 50)개를 List에 순서대로 넣는다. 처음 빈 문자열에는 1부터 9, 비어있지 않다면 0부터 9를 순서대로 넣는다.
private static void backtracking(List<String> list, String now, long n) {
if(list.size() >= 50) {
return;
}
if(!now.isEmpty()) {
long number = Long.parseLong(now);
if(number > n) {
return;
}
list.add(now);
for(char c = '0'; c<='9'; c++) {
backtracking(list, now+c, n);
}
} else {
for(char c = '1'; c<='9'; c++) {
backtracking(list, now+c, n);
}
}
}
결과 코드는 다음과 같다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
for (int tc = 1; tc <= T; tc++) {
sb.append('#').append(tc).append(' ');
long n = Long.parseLong(br.readLine());
List<String> list = new ArrayList<>();
backtracking(list, "", n);
for(String number: list) {
sb.append(number).append(".png").append(' ');
}
sb.append('\n');
}
br.close();
System.out.print(sb);
}
private static void backtracking(List<String> list, String now, long n) {
if(list.size() >= 50) {
return;
}
if(!now.isEmpty()) {
long number = Long.parseLong(now);
if(number > n) {
return;
}
list.add(now);
for(char c = '0'; c<='9'; c++) {
backtracking(list, now+c, n);
}
} else {
for(char c = '1'; c<='9'; c++) {
backtracking(list, now+c, n);
}
}
}
}