[백준] java 2292

Sundae·2023년 7월 18일
0

백준

목록 보기
6/63
post-thumbnail
post-custom-banner

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);
	}	
}

느낀점

풀릴 듯 안풀리면 그렇게 답답할 수가 없다. 하지만 규칙을 찾고나면 굉장한 재미를 느낄 수 있는 유형의 문제라고 생각한다.

profile
성장 기록 / 글에 오류가 있다면 댓글 부탁드립니다.
post-custom-banner

2개의 댓글

comment-user-thumbnail
2023년 7월 18일

글 잘 봤습니다, 감사합니다.

1개의 답글