Bakejoon/Silver

[Java] 백준 1436번 : 영화감독 숌 <Silver 5>

chattymin 2022. 6. 25. 19:52
728x90
반응형

⚠️ 내맘대로 작성한 코드이기 때문에 비합리적 진행과 근거없는 추론이 있을 수 있습니다!⚠️

 

https://www.acmicpc.net/problem/1436

 

1436번: 영화감독 숌

666은 종말을 나타내는 숫자라고 한다. 따라서, 많은 블록버스터 영화에서는 666이 들어간 제목을 많이 사용한다. 영화감독 숌은 세상의 종말 이라는 시리즈 영화의 감독이다. 조지 루카스는 스타

www.acmicpc.net

Code


import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int num = scanner.nextInt();
        int count = 0;
        int temp;
        int result = 666;

        while(true){
            temp = result;
            while(temp > 100){
                if(temp % 1000 == 666){
                    count++;
                    break;
                }
                temp /= 10;
            }
            if(count == num){
                break;
            }
            result++;
        }

        System.out.println(result);
    }
}

Code 필수 요소

1. 연속된 666을 확인하는 방법

2. 브루트포스 활용법

 

이것만 생각해내면 절반은 끝났다.

 

// 연속된 666을 확인하는 방법

먼저 가장 쉬운것은 맨 뒤에 666으로 연속인거다. 그냥 1000으로 나머지 연산하면 1666, 2666, 3666등등 다 나온다. 하지만 골치아픈건 16661같은거. 이건 문자 숫자 사이에 666이라서 한방에 확인할 방법이 없다. 그래서 숫자를 10으로 나누고, 그 값을 1000으로 나머지 연산을 하는 방법을 사용했다. 위에 예시대로 하면 16661은 1666이 되어 666연속이라는걸 판별할 수 있다. 

 

// 브루트포스 활용법

브루트포스란건 말 그대로 모든걸 다 확인하는것이다. 그래서 나도 숫자를 1씩 증가시키며 모두 확인하는 방법을 사용했다. 하지만 0~665까지는 666이 나올 수 없기 때문에 시작 숫자를 666으로 했다. 그리고 while문 조건으로 temp>100을 적어둔 이유는 세자리 미만일 경우 666이 나올 수 없기때문에 불필요한 연산을 하지 않기 위해서다. 

 

// 전체적 설명

result 숫자를 하나씩 증가시키며 666이 나오는지 확인한다. 중간에 666이 있는 경우를 대비하여 /10을 하고 %1000을 하여 마지막에 666이 오게 만들어준다. result를 나누어버릴 경우 원본 값이 훼손되기 때문에 temp에 값을 복제해서 숫자를 나누는데 사용한다. 666이 나올때마다 count를 증가시켜주고, count와 입력한 값이 같아졌을때 반복을 종료하고 result값을 출력한다.

 

코드 자체는 쉬웠다. 사실 브루트포스라서 복잡한 알고리즘 안짜도 돼서 편하다. 물론 이걸 최적화 시키는 방법을 생각해보라면 많이 빡세겠지만...

 

-꿑-

728x90
반응형