본문 바로가기
백준

[백준] 단계별로 풀어보기(단계:11,브루트 포스,JAVA)1436번, 영화감독 숌

by 열정적인 이찬형 2022. 1. 11.

문제 링크

1436번: 영화감독 숌
 
www.acmicpc.net

주의사항

  • JAVA를 사용하여 프로그램을 사용하였습니다.
  • 백준에서 코드를 작성하였을 때 아래 형태에서 Main에서 결과가 출력되어야 합니다.
public class Main{ 	
	public static void main(String[] args){
    }
}

문제 설명


접근 방법

브루트 포스란. 모든 경우의 수를 대입시켜서 가장 알맞은 경우의 수를 결과로 출력하는 것입니다.

첫 작품부터 입력 값까지의 경우의 수를 구하여 결과를 출력하였습니다.

 

문제에서 666의 숫자가 포함되어야 합니다. 그래서 앞에 숫자에 따라 작품에 번호가 달라집니다.

  • XXX6이 앞에 숫자이면 660~669까지  10번 반복된다.
  • XX66이 앞에 숫자이면 600~699까지 100번 반복된다.
  • X666이 앞에 숫자이면 0~999까지 1000번 반복된다.
  • 666X이 앞에 숫자가 올 수 있지만 입력받은 값에는 10000이하의 자연수만 입력받기 때문에 666X가 앞에 자리로 오기 전에 경우의 수가 끝나기 때문에 666X는 올 수가 없습니다.

경우의 수를 XXX6,XX66,X666일 때와 XXXX일 경우를 따져서 문제를 해결하였습니다.

  • BufferedReader를 사용하여 입력 값을 받았습니다.
  • 영화 작품 이름을 구하는 moiveName함수를 만들었습니다.
  • 위에 경우의 수를 if문을 통해서 나누었습니다.
  • 입력 값과 현재 작품의 수를 차이를 통해 for문으로 범위를 반복하는 것이 아닌 바로 구할 수 있도록 하였습니다.
  • 함수 결과를 받아서 bw저장하였습니다.
  • BufferedWriter를 통해 저장된 결과를 출력하였습니다.

결과 코드

import java.io.*;
public class Main{
	public static void main(String[] args) throws IOException{
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //BufferedReader를 통해 입력 값 받기
    	BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
       	//BufferedWriter를 통해 결과 출력
	int num = Integer.parseInt(br.readLine());	//입력값 저장
	String result = movieName(num);		//함수 결과 저장
	bw.write(result + "\n");	//결과 bw에 저장
    	bw.flush();		//결과 출력
    	bw.close();
    	br.close();	
	}
	public static String movieName(int n) {	//영화이름 함수
		String basic = "666";
		int current = 2, first_digit = 1;	//현재 작품, 들어갈 첫 번호
		if(n==1)		//첫 영화일 경우
			return basic;
		else{
			while(true) {
				int dif = n-current;
                		//첫 숫자가 X666일 경우
				if(first_digit%1000==666) {
					if(dif<1000) {
						if(dif>100)
							return first_digit + String.valueOf(dif);
						else if(dif>10)
							return first_digit + "6" + dif;
						else
							return first_digit + "60" + dif;
					}
					else {
						current +=1000;
						first_digit++;
					}
                 		// 첫 숫자가 XX66일 경우
				}else if(first_digit%100==66){
							if(dif<100) {
								if(dif>=10)
									return first_digit + "6" + dif;
								else
									return first_digit + "60" + dif;
							}
							else {
							current +=100;
							first_digit++;
						}
                 		 // 첫 숫자가 XXX6일 경우
				}else if(first_digit%10==6) {
					if(dif<10)
						return first_digit + "66" + dif;
					else {
						current +=10;
						first_digit++;
					}
				}else {
                		if(current==n)	//첫 글자가 6이 아닌 경우
						return first_digit + basic;
					else {
						current++;
						first_digit++;
					}
				}
			}
		}
	}
}

댓글