알고리즘/브루트포스

[백준] 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

→ 이 방법은 코드 작성에 있어서 내가 준비해야 하는 숫자들이 너무 많아져 비효율적!

문제의 핵심

-> 브루트포스 알고리즘 사용

브루트포스 알고리즘

사용조건

  1. 문제에서 달성하고자 하는 솔루션이 잘 정의되어 있어야 함
    • 솔루션이 잘 정의되어 있지 않은 문제라면, 브루트 포스를 사용한 솔루션이 올바른지의 여부를 확인 불가
  2. 문제를 해결할 수 있는 풀이의 수가 제한되어 있어야 함
    • 문제에서 고려해야 할 솔루션의 수가 한정되어 있어야함
    • 고려해야할 솔루션의 수가 무한하거나 너무 크면 브루트포스 알고리즘은 효율적이지 않은 방법
    참고 : https://olrlobt.tistory.com/33

 

풀이


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++;
}