김펭귄 관찰일기
article thumbnail

https://www.acmicpc.net/problem/2292

 

2292번: 벌집

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

www.acmicpc.net

 

1. 문제


💡 문제

위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.

💡 입력

첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.

💡 출력

입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.

 

 

2. 풀이


#include <stdio.h>

int main(){
    long room = 0, result = 0, check = 6;

    scanf("%ld", &room);
    
    room -= 1;
    result++;
    
    if (room > 0){
        do{
            result++;
            room -= check;
            check += 6;
        } while(room > 0);
    }
    
    printf("%ld\n", result);
}

 

 

3. 메모


악필이지만..

 

 문과 출신인 내게는 문제를 이해하는 것도 버거웠다.. 그래서 일단 그림을 그렸다.

 흠.. 가만 보니 의외로 쉽게 규칙성을 찾을 수 있었다. 하나의 육각형들이 테두리가 되어 다시 큰 육각형을 그리는데, 첫 번째 육각형 (1)을 제외한 나머지 육각형들은 6, 12, 18, 24, ..., 이런 식으로 6 X A 만큼 증가한다. 이를 바탕으로 코드를 짜보았다.

 

#include <stdio.h>

int main(){

	// 몇 번째 칸을 체크할지 입력 받을 room
    // 몇 개의 칸을 지나야 해당 칸에 도착하는지를 체크하는 result
    // 위에서 6 x A 만큼 육각형의 각 변에 해당하는 칸들이 증가하기에 그 값을 체크해줄 check
    long room = 0, result = 0, check = 6;

    scanf("%ld", &room);
    
    // 첫 번째 칸은 규칙에 해당하지 않기에 -1을 더하고 result 값을 1만큼 증가시킨다.
    room -= 1;
    result++;
    
    // 칸의 값이 2 이상이라면 위에서 체크하고도 값이 남기에 아래 do ~ while ... 을 실행한다.
    if (room > 0){
    
    	// result 값을 1만큼 증가시키고, room에서 check만큼 값을 빼준다.
        // 그리고 check 값을 6만큼 증가시킨다.
        // 이렇게 되면 check 값은 계속해서 6만큼 증가하며 그 값만큼 room에서 빠져나갈 것이다.
        // 그리고 result 값은 위 조건이 실행될 때마다 1만큼 증가한다.
        do{
            result++;
            room -= check;
            check += 6;
            
        // room의 값이 0보다 크다면 위 do 실행문을 실행한다.
        } while(room > 0);
    }
    
    printf("%ld\n", result);
}

 

P.S. 나.. 의외로 강할지도..?

profile

김펭귄 관찰일기

@Penguin.Kim