https://www.acmicpc.net/problem/2292
문제
위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
접근 방법 / 풀이 과정
규칙을 찾는 문제. 바로 전 게시물과 비슷한 유형의 문제인 것 같다.
그림을 유심히 보았는데, 1을 중심으로 새로운 벌집테두리가 하나씩 생기고 있다. 1을 감싸는 2 - 7까지 테두리 하나 , 그것을 또 감싸는 8 - 19까지의 테두리 하나. 문제의 요구는 1번방에서 N번방까지 몇 개의 방을 지나가는지를 말한다.
N이 몇 번째 테두리에 있는지를 생각해보았다.
그러려면 어디서 어디까지의 숫자가 하나의 테두리를 이루고 있는지 알아야한다.
1
2~7 6 2
8~19 12 3
20~37 18 4
38~61 24 5
62~91 30 6
테두리를 이루고 있는 숫자의 범위와 총 개수이다.
이를 잘 보면 규칙을 발견할 수 있다.
n+1번째 테두리의 총 숫자 개수와 n번째의 마지막 숫자를 더하면 n+1의 마지막 숫자를 알 수 있다!
예를 들어 두번째 줄과 세번째 줄을 보자.
두번째 줄 테두리의 마지막 숫자인 7과 세번째 줄 테두리의 총 숫자개수인 12를 더하면 세번쨰 줄 테두리의 마지막 숫자인 19가 나온다. 밑에 줄에도 해당하는 규칙이다.
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(bf.readLine());
/*
1
2~7 6 2
8~19 12 3
20~37 18 4
38~61 24 5
62~91 30 6
마지막 숫자 + 6 * x(1)++ -> 다음 벌집테두리의 마지막 숫자
*/
int sum = 1;
int six = 1;
int count = 1;
while( true ) {
sum += 6 * six;
if ( N == 1)
break;
if ( sum >= N) {
count++;
break;
}
count++; six++;
}
System.out.println(count);
}
}
느낀점
풀릴 듯 안풀리면 그렇게 답답할 수가 없다. 하지만 규칙을 찾고나면 굉장한 재미를 느낄 수 있는 유형의 문제라고 생각한다.
글 잘 봤습니다, 감사합니다.