coding test - python/백준

백준 / 2292번 벌집 / Python 파이썬

sillon 2022. 4. 27. 20:48
728x90
반응형

 

*문제 출처는 백준에 있습니다.

문제 제목: 2292번 

문제 사이트: https://www.acmicpc.net/problem/2292

 

2292번: 벌집

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

www.acmicpc.net

 

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

 

 


나의 풀이 

 

 

문제 유형이 기본 수학인만큼 규칙을 찾고 이를 코드로 구현해서 답을 구하는 것이 핵심이다.

 

여기서 "입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다." 는 조건을 통해서 방을 지나는 데에는 최소의 비용이 들어야함을 알 수 있다.

 

그림을 보고 여러 추론을 할 수 있겠지만, 숫자들의 배열을 통해서 어떻게 방이 배열되어있는지를 잘 관찰해야한다.

 

1을 둘러싼 숫자들을 가까이 있는 것 부터 정리해보았다.

방의 구조가 이렇게 되어있는 것을 알 수 있다.

2~7 사이의 숫자의 방에 도착하려면 2개의 방을 건너야하고,

8~19 사이의 숫자의 방에 도착하려면 3개의 방을 건너야한다.

 

따라서 이 수들의 규칙을 보면

 

 

 

방의 숫자와 건너야하는 방의 개수들의 규칙으로 코드에 구현하면 아래와 같은 코드를 구현할 수 있다.

 

 

n = int(input())
numbee = 1 # 벌집의 개수
cnt = 1 # 지나간 벌집의 수

if n == 1:
    print(1)
else:
    while n > numbee:
        numbee += 6 * cnt # 수열
        cnt += 1
    else:
        print(cnt)

 

 

N값을 입력받고, numbee를 통해 N보다 커질 때 까지 while문을 반복한다.

 

만약, N = 10이라 하자,

while문 1회 실행:

10 > numbee = 1

numbee += 6 * 1 # 1번 방을 지남

cnt 1 증가 (현재 cnt = 2) # 2번째 껍질에 있는 방을 간다.

 

while문 2회 실행:

10 > numbee = 7

numbee += 6 * 2 # 2번 방을 지남

cnt 1 증가 (현재 cnt = 3 ) # 3번째 껍질에 있는 방을 간다.

 

while문 3회 실행

10 < numbee = 7+12 = 19

따라서 while문의 조건 불만족하므로 else로 간다.

 

숫자 10은 3번째 껍질에 있는 방이므로

else문에서 cnt를 통해 답을 출력한다.


 

728x90
반응형