본문 바로가기
알고리즘(코딩테스트)

백준 2292번 벌집(JAVA)

qbang 2024. 3. 4.
 

2292번: 벌집

위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌

www.acmicpc.net

풀이코드

import java.util.*;
import java.io.*;

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        int target = Integer.parseInt(st.nextToken());
        int pass = 1; 	// 숫자 1로부터 지나온 방 수
        int max = 0;  // 탐색한 영역에 써있는 숫자의 최댓값
        
        while (max < target) { // 아직 타겟 숫자보다 찾은 숫자가 더 작으면
            pass += 1; // 지나온 방 수를 증가
            max += (6 * pass); // 숫자의 최대값 갱신
        }
        
        System.out.println(pass + 1); // 시작점을 포함하므로 1이 써져있는 방을 더해준다
    }
}

 

풀이과정

숫자 1을 기준으로 붙어있는 숫자들의 규칙을 찾는다.

지나쳐 온 방(pass)이 0일 때 탐색한 숫자 중 가장 큰 숫자는 1이다.

문제에 시작과 끝을 포함한다고 되어 있으니 만약 숫자 1을 찾는다면 지나온 방 수는 1이다. 

지나쳐 온 방(pass)이 2일 때 탐색한 숫자 중 가장 큰 숫자는 7이다.

지나쳐 온 방(pass)이 2일 때 탐색한 숫자 중 가장 큰 숫자는 19이다.

지나쳐 온 방(pass)이 3일 때 탐색한 숫자 중 가장 큰 숫자는 37이다.

지나쳐 온 방이 4일 때는 61, 5일 때는 91 ...

가장 큰 숫자를 나열해보면 1, 7, 19, 37, 61, 91 ... 각 숫자의 차이는 6, 12, 18, 24, 30 ... 지나쳐 온 방이 증가할수록 6의 배수가 더해지고 있는 것을 찾을 수 있다.

 

이를 코드로 나타내어 지나쳐 온 방에서 찾을 수 있는 가장 큰 수(max)를 찾아준다.

 

max += (6 * pass); // 숫자의 최대값 갱신

max는 지나쳐 온 방 수 * 6의 배수만큼 증가한다. 

 

while (max < target) { // 아직 타겟 숫자보다 찾은 최대값이 더 작으면
    pass += 1; // 지나온 방 수를 증가
    ...

만약 입력값이 max보다 작으면 현재는 찾을 수 없는 값이므로 max를 증가시켜준다.

 

만약 max가 더 크다면 찾을 수 있는 값이므로 반복문을 즉시 종료하고, 시작점을 포함하므로 지나온 방 수 + 1을 출력시켜야 한다.

댓글