알고리즘/브루트포스
[백준] 1436번 영화감독 숌 자바(Java)
park-walnut
2024. 12. 26. 16:33
문제
접근법
처음에는 N의 범위를 찾아 출력되는 숫자의 자릿수를 찾는 방식으로 풀려고 했다.
더보기
a: 1666, 2666, …
b: 6661, 6662, 6663, …
c: 7666, 8666, 9666
- 4자리 : 5 + 10 + 3
- 5자리 : 5x18 + 10x10 + 3x19
- …
→ 이 방법은 코드 작성에 있어서 내가 준비해야 하는 숫자들이 너무 많아져 비효율적!
문제의 핵심
-> 브루트포스 알고리즘 사용
브루트포스 알고리즘
사용조건
- 문제에서 달성하고자 하는 솔루션이 잘 정의되어 있어야 함
- 솔루션이 잘 정의되어 있지 않은 문제라면, 브루트 포스를 사용한 솔루션이 올바른지의 여부를 확인 불가
- 문제를 해결할 수 있는 풀이의 수가 제한되어 있어야 함
- 문제에서 고려해야 할 솔루션의 수가 한정되어 있어야함
- 고려해야할 솔루션의 수가 무한하거나 너무 크면 브루트포스 알고리즘은 효율적이지 않은 방법
풀이
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
int num = 666;
int count = 1;
String s = Integer.toString(num);
while (N != count) {
num ++;
// System.out.println(num);
s = Integer.toString(num);
if (s.contains("666")) {
count++;
}
}
bw.write(s);
bw.flush();
}
}
트러블슈팅
이슈 1
- 문제
- '666'의 연속된 수를 어떻게 처리할까?
- 원인
- 자바의 Integer형에는 숫자가 포함되어 있는지 확인하는 메서드가 없다.
- 해결
- 숫자를 문자열로 변환하여 문자열의 subString을 확인하자!
s = Integer.toString(num);
if (s.contains("666")) {
count++;
}