Java/백준알고리즘

[Java] 백준알고리즘 #1436 영화감독 숌

Sehyeok20 2021. 3. 18. 19:37
반응형

백준알고리즘 #1436 영화감독 숌 문제

666을 포함하는 수 중 가장 작은 수 부터 순서를 매겨 N번째의 수를 구하는 문제이다.

 

이를 해결하기 위해서는 i라는 변수를 두고 이 수를 1부터 차례로 증가시키며

이 수가 666을 포함하는지 안하는지를 확인하면 된다.

만약 666을 포함한다면 count를 증가시켜 count 와 n이 같아질 때의 i값이 n번째 영화 제목이 될 것이다.

 

이를 위해 while문을 이용한다.

while(count != n) {

	if (check(i)) {
		count++;
		if (count == n) {
			System.out.println(i);
		}

	}
	i++;
}

여기서 check() 메소드는 이 수가 666을 포함하는지 아닌지를 판별해 주는 함수이다.

이 함수의 반환값이 true일 때 count를 증가시키고, count가 n과 같아질 때 i를 출력하고 반복문을 종료하면 된다.

 

다음은 이 i를 체크해주는 check() 메소드를 보도록 하자.

public static boolean check(int i) {
	int count = 0;
	while (i > 0) {
		if (i % 10 == 6) {
			i = i / 10;
			count++;
		} else {
			i = i / 10;
			count = 0;
		}

		if (count == 3) {
			return true;
		}
	}
	return false;
}

마찬가지로 while문을 이용하여 입력받은 수를 0이 될 때 까지 반복한다.

i를 10으로 나눈 나머지가 6이라면 count를 증가시키고 아니라면 count를 0으로 다시 초기화한다.

이것이 반복되어 count가 3이라면 6이 연속적으로 3번 나왔다는 말이 되므로 이 때 true를 리턴해준다.

10666 이라면 count가 3이되어 정상적으로 true가 리턴될 것이고

16066 이라면 count가 2에서 다시 0으로 초기화 된 후 1이 될 것이기 때문에 false를 리턴한다.

 

이 함수를 이용해 true / false 를 리턴받고 위의 main메소드 내의 while문에서 

이 수가 666을 포함한 수인가 아닌가를 판별하면 되겠다.

 

전체 코드를 보면 다음과 같다.

import java.util.Scanner;

public class Back1436 {
	public static boolean check(int i) {
		int count = 0;
		while (i > 0) {
			if (i % 10 == 6) {
				i = i / 10;
				count++;
			} else {
				i = i / 10;
				count = 0;
			}

			if (count == 3) {
				return true;
			}
		}
		return false;
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int count = 0;
		int i = 666;
		while (count != n) {

			if (check(i)) {
				count++;
				if (count == n) {
					System.out.println(i);
				}

			}
			i++;
		}

	}
}

 

반응형