코딩테스트/백준(BOJ)

백준(BOJ) - 벌집(2292번) - 파이썬(python)

진한색 2023. 1. 31. 19:56

문제

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

입력

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

출력

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

 

 

풀이

중앙을 기준으로 몇겹째에 있는가를 찾는 문제다.

1은 1겹/ 2~7까지 2겹/ 8~19까지 3겹/ ... 의 규칙을 가진다.

 

1겹은 벌집1개 2겹부터 순서대로 벌집의 갯수는 2,8,20 ... 이고 그 차이가 6,12,18..씩 커지는 것을 알 수 있다.

import sys
input=sys.stdin.readline


n=int(input().rstrip())

i=2 # i겹
step=6
res=2 # 2겹의 첫수
while 1:
    tmp=res
    res+=step*(i-1) # 6의 배수로 커짐
    
    # n이 i겹에 있는 수라면 정답은 i
    if tmp<=n<res:
        print(i)
        break
    i+=1

 

정답은 맞는 것 같지만 94%부터는 시간 초과가 난다

 

while문을 간단하게 손보자

 

import sys
input=sys.stdin.readline


n=int(input().rstrip())

# i겹
i=1
# 벌집의 개수
res=1

while n>res:
    res+=6*i # 벌집의 개수 6의 배수로 커짐
    i+=1
    
print(i)

728x90