영화감독 숌
문제
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번째 영화의 제목에 들어간 수를 출력한다.
예제 입력 1
2
예제 출력 1
1666
예제 입력 2
500
예제 출력 2
166699
java 코드
이 문제는 브루트포스 알고리즘 문제로, 모든 수를 나열하면서 중간에 666이 있는지 검사하면 됩니다. 간단하죠?
브루트포스 알고리즘에대해서는 아래에 설명하므로 쭉 스크롤하시면 됩니다!
while(temp>=666) 부분이 수에 666이 있는지 검사하는 반복문인데요, '~~666'은 1000을 나눈 나머지를 이용해서 구할수 있습니다.
그러나 중간에 666이 있는 경우에는 일의자리, 십의 자리등의 숫자를 없애고 1000 나머지연산자로 구할수 있으므로 반복할때마다 10을 나워서 일의자리 숫자를 제거해 줍니다.
cnt는 ~번째 영화를 가리키는 수 입니다.
탐색을 거듭할수록 1씩 올라가고, n이랑 같아지면 cnt가 곧 답이 됩니다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt(); // nth count
scan.close();
int cnt = 0; //count
int asw = 660; // answer
while(n > cnt){
asw++;
int temp = asw;
while (temp>=666) {
if(temp%1000 == 666){
cnt++;
break;
}
else{
temp/=10;
}
}
}
System.out.println(asw);
}
}
브루트포스 알고리즘
Brute : 난폭한 / Force : 힘 두 의미를 합하면 난폭한 힘(?)으로 해석이 됩니다.
간단히 설명하자면 무식하게 모든 경우의 수를 탐색하면서 요구조건에 충족되는 결과만을 가져옵니다.
- 이 알고리즘의 가장 큰 특징은 모든 영역을 전체 탐색하는 방법입니다.
- 전체 탐색하는 방법으로는 선형 구조를 전체적으로 탐색하는 순차 탐색, 비선형 구조를 전체적으로 탐색하는 깊이 우선 탐색(DFS), 너비 우선 탐색(BFS) 가 기본적인 도구입니다.
- 어떤 방식으로든 전체 탐색으로 문제를 해결한다면 브루트 포스 알고리즘으로 풀었다고 할 수 있습니다.
그러므로 이 문제도 cnt를 1씩 증가시키면서 모든 수를 조건에 충족시키는지 반복문을 통해서 검사를 하면서 구했으므로 브루트포스 알고리즘 문제로 볼 수 있습니다.
'알고리즘 PS (백준) > ☕️ Java (자바)' 카테고리의 다른 글
[백준 2164번] java(자바) 큐(Queue) 개념과 활용 - 카드2 (0) | 2022.07.26 |
---|---|
[백준 2161번] java(자바) 큐(Queue) 개념과 활용 - 카드1 (0) | 2022.07.21 |
[백준 9012번] java(자바) 스택(stack) 개념과 활용 - 자료구조 (0) | 2022.07.19 |
[백준 19939번] 박 터뜨리기 - java(자바) 그리디 알고리즘 (0) | 2022.07.12 |
자바(java) Reader , Writer - 문자 기반 스트림 + Scanner (0) | 2022.04.20 |
댓글