컴퓨터 공학/백준
[백준] JAVA 자바 : 영화감독 숌 (1436번)
kim-dev
2024. 6. 21. 22:03
반응형
문제는 대강 이렇다.
따로 쓰기 귀찮으니 스샷을 참조해주십쇼.
사실 나는 문제를 이해하는 데만 한 10분은 걸린 것 같다...
끝내 종말을 나타내는 수는 666이 포함되는 수라고 이해할 수 있었다!
그러면... 우리는 아래 사항들을 고려해 보아야 한다.
1. 숫자의 끝 부분에 6이 들어가지 않는 경우
이 경우에는 그냥 현재 수의 마지막에 666을 붙여주기만 하면 된다.
2. 숫자의 끝 부분에 6이 하나 들어가는 경우
이 경우에는 현재 수의 마지막에 660~669까지 붙일 수 있다.
왜냐? 현재 수가 16이라면 16과 66x를 붙여서 1666x가 되어 종말을 나타내는 수가 되니까!
3. 숫자의 끝 부분에 6이 두 개 들어가는 경우
이 경우에는 현재 수의 마지막에 600~699까지 붙일 수 있다.
4. 숫자에 666이 포함되는 경우 (끝 부분이 아니어도 됨)
이 경우에는 현재 수의 마지막에 000~999까지 붙일 수 있다.
코드로 구현하면 아래와 같다.
import java.util.*;
import java.io.*;
public class DirectorShom {
public static int stoi (String str) {
return Integer.parseInt(str);
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[] array = new int[10001];
array[0] = 666;
int lastCount = 0; // 마지막 수
for (int i=0; i<10001; i++) {
if (Integer.toString(lastCount).contains("666")) { // 666이 포함되어 있다면
// 000~999까지 모든 수가 그 아래로 들어갈 수 있다.
for (int j=0; j<1000; j++) {
if (i+j < 10001) {
array[i+j] = lastCount*1000 + j;
}
}
i+=999;
} else if (lastCount%100 == 66) { // 66으로 끝난다면
// 600~699까지의 수가 그 아래로 들어갈 수 있다.
for (int j=0; j<100; j++) {
if (i+j < 10001) {
array[i+j] = lastCount*1000 + 600 + j;
}
}
i+=99;
} else if (lastCount%10 == 6) { // 6으로 끝끝난다면
// 660~669까지의 수가 그 아래로 들어갈 수 있다.
for (int j=0; j<10; j++) {
if (i+j < 10001) {
array[i+j] = lastCount*1000 + 660 + j;
}
}
i+=9;
} else { // 6이 끝에 포함되지 않으면
array[i] = lastCount*1000 + 666; // 맨 뒤에 666을 붙인다
}
lastCount++;
}
int N = stoi(br.readLine());
System.out.println(array[N-1]);
}
}
사실 이거 해결하는 데 1시간 정도 걸렸다...ㅋㅋㅋ
브루트포스는 왜 이렇게 어렵지?? 그래도 다른 알고리즘 실버 정도는 손쉽게 풀 수 있는데...ㅠㅠㅠ
아무래도 브루트포스는 더 열심히 공부해야 할 것 같다.