코딩테스트/백준 단계별

[백준 7단계] 2292 벌집

scone 2022. 5. 12. 17:41

🥕 [ 백준 2292 ] 벌집

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

 

2292번: 벌집

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

www.acmicpc.net

 

🍒 문제 분석

벌집 모양으로 인덱스가 주위를 빙글빙글 돌며 매겨진다고 한다.

인덱스 N 값은 1번 방으로 부터 최단거리로 몇 개의 방을 들러야 할까? 단, 1번 방과 N번방을 포함하여 센다.

예를 들어 3번 방은 2개, 26번방은 4개 이다.

 

🥑 코드

N = int(input())
n = 1
while True:
    S = 1+(6*(n-1)*n)//2     # 점화식 구해서 계산함
    if N <= S:
        break
    n +=1
print(n)

 

🍓 내 해결 과정

전형적인 군수열 문제인걸 알 수 있었다.

군의 갯수에 대한 점화식을 세우고자 숫자를 세봤다.

1군 :  1                                            # 1개

2군 : :2, 3, 4, 5, 6, 7                             # 6개

3군 : 8 ~ 19                                      # 12개

4군 : 20 ~ 37                                     # 18개

5군 : 38 ~ 61                                     # 24개

군수열 갯수에 대한 점화식 : \(a = 6*k-6\ 단,\ n=1일때\ a=1 \)

$$ 1+\Sigma^{k=n}_1(6*(k-1)) = 1 + 6*(n-1)*n/2 $$

 

n이 각 군에 해당 ( 또는 room의 갯수 )

각 군에 속한 인덱스 갯수의 합을 수열 a

수열 a의 합보다 인덱스 값이 더 작거나 같은 부분을 발견한다면,

그때의 군의 값이 곧 들르는 방의 숫자가 된다.

 

가령  11 의 경우 3군 까지의 수열 합 보다 더 작은 인덱스이고

따라서 11은 3군에 속하여, 방의 갯수는 3이다.

 

오랜만에 점화식 푸니 조금 헷깔리고 시간이 걸렸다.

 

 

🌽 다른 사람 코드

n = int(input())
room = 1
count = 1

while n > room:
    room += 6 * count
    count += 1
print(count)

팀원 분 코드를 참고했다.

 

count가 군에 해당하는 듯 하다.

room의 값을 다음과 같이 더해나가며 인덱스 값 n과 비교했다.

 

room = 1

room = 1+6

room = 1+6+12

...

 

room에 대한 연산 값은 내 수열 합에 대한 식과 같다.

room이 수열 합에 해당하는 것 같다.

 

점화식 계산하는 것 보다 이렇게 푸는게 더 빠르고 깔끔해 보였다.

 

 

🍉 깨달은 점 및 정리

 

간단하고 좋았다.

 

다만 유의할 점은, 가령 8군에 해당하는 8군 안의 인덱스 값은

8군까지의 합보다 늘 작다는 것을 기억해두자.