Algorithm
[BaekJoon] 백준 알고리즘 229번 / 벌집
bkuk
2023. 2. 23. 11:21
문제

위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
입력
첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.
출력
입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.
접근방법
- 이 문제는 솔직히 수학적 사고가 없는 필자에겐 어려운 문제였다.
- 해답까지 많은 시간이 소요되었다.
- 자, 아래 사진을 보자

- 가장 안쪽 빨간색 육각형을 보면 2번 ~ 7번이 있다. 총 6개의 숫자가 하나의 껍질이다.
- 그 다음으로 노란색 육각형을 보면 8번 ~ 19번이 있다. 총 12개의 숫자가 하나의 껍질이다.
- 그 다음으로 파란색 육각형을 보면 20번 ~ 37번이 있다. 총 18개의 숫자가 하나의 껍질이다.
- 이로써 알 수 있는 규칙이 있다. 껍질이 하나씩 증가하면 포함되는 숫자는 6의 배수로 증가한다.
- 아래 코드를 보자.
- 값을 입력받고, n--을 했다. 이유는 만약 2를 입력받았다면 1이 되고, 7을 입력받았다면 6이 된다.
- 그렇다면 어떤 껍질에 있는지 헷갈리지않고 잘 확인할 수 있다.
- range는 몇번째 껍질인지 확인하고, 그에 따라 몇개의 방인지 체크하는 roomCount가 있다.
- 다시, 7을 입력받았다면 n--을 통해 6이 되고, n > 0 가 true가 되어서 while문이 실행된다.
- 현재 n이 6인데 n - ( 6 * 1 ) 을 통해 0이 되어서 다시 조건문을 검사한다.
- 0 > 0 은 false가 되어서 roomCount를 출력한다.
BufferedReader br = new BufferedReader( new InputStreamReader(System.in) );
int n = Integer.parseInt( br.readLine() );
n--;
if( n == 0 ) {
System.out.println( 1 );
} else {
int range = 1;
int roomCount = 1;
while( n > 0 ) {
n = n - ( 6 * range );
range++;
roomCount++;
}
System.out.println( roomCount );
}
(참고)조건문을 도출하기 위한 그림이다.