본문 바로가기

알고리즘/백준알고리즘

[백준알고리즘-JAVA]1436번 풀이(영화감독 숌) - 초보도 이해하는 풀이

안녕하세요

인포돈 입니다.

백준 알고리즘 1436번 풀이입니다. 


* 참고사항
 - 개발환경은 eclipse을 기준으로 작성되었습니다.
 - java언어를 이용하여 문제를 풀이합니다.
 - 알고리즘 문제는 풀이를 보고 해답을 찾는 것도 중요하지만 무엇보다 스스로 풀이를 시도해봐야 합니다!!
(해당 풀이를 보기 전 충분히 문제에 대해 고민해봐야 합니다!)
 - 해당 풀이 말고도 수많은 풀이 방법이 존재합니다.


백준 1436 (영화감독 숌)

문제

666은 종말을 나타내는 숫자라고 한다. 따라서, 많은 블록버스터 영화에서는 666이 들어간 제목을 많이 사용한다. 영화감독 숌은 세상의 종말 이라는 시리즈 영화의 감독이다. 조지 루카스는 스타워즈를 만들 때, 스타워즈 1, 스타워즈 2, 스타워즈 3, 스타워즈 4, 스타워즈 5, 스타워즈 6과 같이 이름을 지었고, 피터 잭슨은 반지의 제왕을 만들 때, 반지의 제왕 1, 반지의 제왕 2, 반지의 제왕 3과 같이 영화 제목을 지었다.

하지만 숌은 자신이 조지 루카스와 피터 잭슨을 뛰어넘는다는 것을 보여주기 위해서 영화 제목을 좀 다르게 만들기로 했다.

종말의 숫자란 어떤 수에 6이 적어도 3개 이상 연속으로 들어가는 수를 말한다. 제일 작은 종말의 숫자는 666이고, 그다음으로 큰 수는 1666, 2666, 3666,.... 과 같다.

따라서, 삼은 첫 번째 영화의 제목은 세상의 종말 666, 두 번째 영화의 제목은 세상의 종말 1666 이렇게 이름을 지을 것이다. 일반화해서 생각하면, N번째 영화의 제목은 세상의 종말 (N번째로 작은 종말의 숫자)와 같다.

섬이 만든 N번째 영화의 제목에 들어간 숫자를 출력하는 프로그램을 작성하시오. 삼은 이 시리즈를 항상 차례대로 만들고, 다른 영화는 만들지 않는다.

입력

첫째 줄에 숫자 N이 주어진다. N은 10,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 N번째 영화의 제목에 들어간 수를 출력한다.

입력 예시

2

출력 예시

1666

성공코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Main {
	
	public static void main(String args[]) throws IOException{
	   	  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	   	 
	   	 	int num = Integer.parseInt(br.readLine());
	   	 	int count = 0;
	   	 	
	   	 	for(int i = 0 ; true ; i++) {
	   	 		String str = Integer.toString(i);
	   	 	if(str.contains("666"))
	   	 		count ++ ;
	   	 	
	   	 if(count == num) {
	   	 		num = i;
	   	 		break;
	   	 }
	   	 	
	   	 	}
	   	 	System.out.println(num);
	   	 	
	   	 	}
		}

f;ㄴㅁ린 알ㄴㅁㅇㄻㄴ 영화감독 숌 알고리즘에서 중요하게 볼 것은 바로 666이 3개 이상 반복해서 나오는 것을 어떻게 감지할 것인가입니다.

 

여러 가지 방법이 있을 수 있습니다. 해당 숫자를 반복하면서 배열에 넣어서 검사해 볼 수 도 있으며, 제가 풀이한 것처럼 문자열에 넣어 contain을 사용하여 판별할 수 도 있습니다. 

 

해당 STEP을 따라가며 제 풀이를 이해해 봅시다~


알고리즘 흐름도

입력받기 -> 무한 반복을 하면서 만약 666에 들어있다면 count를 올려준다. -> 만약 올려준 count가 입력받은 값과 동일하다면 무한 반복문을 탈출한다. -> 그 값을 출력한다.

 


STEP1 무한 반복을 통해서 만약 666이 포함되어 있다면 count를 올려주기

for(int i = 0 ; true ; i++) {
	   	 		String str = Integer.toString(i);
	   	 	if(str.contains("666"))
	   	 		count ++ ;
                }

반복문을 돌려주는 값을 문자열로 변화시켜 준되 반복문을 통해 666이 들어있다면 count를 1개씩 올려줍니다.

 

뭐... 이번 코드는 별거 없고 contains 메서드를 알고 있다면 쉽게 풀이하실 수 있습니다.

 

contains 메서드는 해당 문자열에 (" ~~ ") 이사이에 있는 문자열이 있다면 true를 반환해 주는 메서드입니다.

 


STEP2 count와 입력받은 값이 동일하다면 반복문을 탈출하자!

 if(count == num) {
	   	 		num = i;
	   	 		break;
	   	 }

간단하죠? num에 i를 넣어준 것은 결괏값으로 num을 출력해 주기 위해서입니다.

 

헷갈리신다면 또 다른 변수를 선언해도 됩니다 ~ (변수 선언을 최소화하기 위해서 사용했습니다!)

 

이후 break;문을 통해 문한 루프를 탈출해버리죠!

 

그리고 System.out.println을 통해 num을 출력만 해주면 해당 알고리즘도 쉽게 풀이할 수 있습니다 ~