[백준] 1436번 : 영화감독 숌 - Java(자바)

이정우·2021년 12월 29일
0

백준

목록 보기
28/32

이번 문제는 6이 3번 연속으로 쓰이는 숫자의 순서를 찾는 문제였습니다.
쉽게 브루트포스 알고리즘을 사용해서 가능한 모든 경우를 찾았고 재귀함수를 사용해서 문제를 풀어봤습니다.

Step 0. 해답 코드

import java.util.Scanner;
//브루트포스 알고리즘. 모든 경우의 수를 전부 생각해봄.

//숌이 만든 N번째 영화의 제목에 들어간 숫자를 출력하는 프로그램을 작성하시오. 666이 연속으로 사용됨.
public class Movie_1436 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt(); //N번째 영화
		
		System.out.println(search_N(N));
	}
	static int i = 666;
	static int cnt = 0;
	public static int search_N(int N) {
			if (Integer.toString(i).contains("666")) {
				cnt++;
			}
			if (cnt == N) {
				return i;
			}
			i++;
			return search_N(N);
		}
	}

contains 함수를 사용해서 쉽게 풀 수 있었던 문제였습니다.

Step 1. 문제 접근

문제에서는 6이 연속으로 세 번 나오는 문자일 경우 해당 숫자를 영화의 제목으로 사용한다고 했습니다. 즉 666 > 1666 > 2666 > 3666 > 4666 > 5666> 그리고 6660 > 6661 > 6662 >... > 6669 > 7666 > 8666...
이런 식으로 영화 제목을 지을 수 있습니다. 즉 숫자를 666부터 시작해서(원래는 1부터지만 영화 제목으로 가능한 가장 작은 수가 666이기에 666부터 시작했습니다.) 1씩 증가하면서 해당 숫자에 6이 연속으로 세 번 쓰이는지를 브루트포스 알고리즘 방식으로 풀 수 있습니다. 또한 for문을 써도 되지만 재귀함수를 사용해서도 풀 수 있을 거 같았기에 재귀함수를 사용해 봤습니다.

Step 2. 문제 해결

static int i = 666;
static int cnt = 0;

i는 1씩 증가할 숫자이고 cnt는 해당 제목이 몇 번째 제목인지를 연산할 변수입니다. 또한 해당 변수는 정적 메소드에서 사용할 것이기 때문에 static으로 선언해줬습니다.

public static int search_N(int N) {
			if (Integer.toString(i).contains("666")) {
				cnt++;
			}
			if (cnt == N) {
				return i;
			}
			i++;
			return search_N(N);
		}

재귀 함수로 풀기 위해서 search_N 메소드는 N값을 받고 조건을 만족할 때 까지는 return 값으로 자기 자신을 불러왔습니다.
조건에서는 contains 메소드를 사용해서 666이 존재하면 true값을 반환해줘서 cnt 값을 늘려줬고 cnt값이 늘어나다가 문제에서 제시한 N(몇 번째 영화인지)값과 일치하게 되면 이때의 i값을 리턴해주면서 메소드를 종료시켰습니다. 또한 contains 메소드는 문자열에서 사용하는 메소드이기 때문에 입력받는 값을 문자열로 바꾸기 위해 toString 메소드를 사용했습니다.

Step 3. 느낀 점

처음에는 무언가 규칙이 있지 않을까 하고 종이에 숫자를 적어두고 1시간 가량 찾아봤습니다.
뭔가 규칙이 보일 거 같으면서도 보이지 않았기에 마지막으로 선택한 방식이 문제에서도 풀라고 힌트를 준(백준의 해당 문제 맨 밑에 참고 알고리즘 부분) 브루트포스 알고리즘 방식을 사용해서 풀었습니다. contains 메소드를 사용해서 어렵지 않게 풀 수 있었던 문제였습니다.

또한 두 번째 zoom 미팅으로 푼 문제였는데 원래는 네 분이서 진행하는데 두 분이 불참하셔서 아쉬움이 남았습니다. 다른 분과 코드를 비교해보니 그 분은 for문을 써서 저와 비슷하게 푸신 걸 볼 수 있었습니다. 코드 자체는 비슷해도 이렇게 제가 푼 문제를 남에게 설명하는게 쉽지는 않지만 제가 이해한걸 누군가에게 설명한다는 거 자체가 저에게 더욱 도움이 되는거 같기에 계속 열심히 zoom 미팅을 해보고자 합니다.

출처 : 백준 1436번 https://www.acmicpc.net/problem/1436

profile
프로그래밍 공부 중!

0개의 댓글