파이썬 벌집(백준 BOJ 2292)


문제

img

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


입력

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


출력

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


예제 입력 1

13

예제 출력 1

3


📝 풀어보기

# 1 = 시작점
# 2~7(6), 8~19(12), 20~37(18), 38~61(24)

# 등차수열 
# N번째 항의 값 = 시작숫자 + (시작숫자-1) * 공차
start = 1 # 시작지점(시작숫자)
res = 0 # 도착까지 횟수 
goal = int(input()) # N번째 항의 값, 목표지점

for i in range(0, goal): 
    start += res * 6
    if start < goal:
        res += 1
    else:
        res += 1
        break
print(res)

📌 벌집은 일정한 규칙이 있다. 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가한다. 시작점에서 한 바퀴를 돌아 다른 지점으로 갈 때마다 방의 개수가 6개씩 일정하게 증가한다. 이를 등차수열 이라고 한다.

📌 등차수열의 공식은 다음과 같다.

N번째 항의 값 = 시작숫자 + (시작숫자-1) * 공차

  1. 이 문제에서 입력값은 N번째 항의 값을 나타낸다.(도착지점)

  2. 시작지점은 본문의 내용대로 중앙의 방 1부터 시작한다.

  3. 공차 또한 위의 내용을 볼때 6이라는걸 알수있다.

위의 내용을 토대로 도착까지 횟수를 구해보자

start = 1 # 시작지점(시작숫자)
res = 0 # 도착까지 횟수 
goal = int(input()) # N번째 항의 값, 목표지점

📌 먼저 시작지점, 도착까지 횟수, 입력받을 목표지점의 값에 대한 변수를 선언한다.


for i in range(0, goal): # 0부터 목표지점의 범위 
    start += res * 6 # 시작지점(start) + 도착횟수(res) * 공차(6)를 start에 저장
    if start < goal: # 위에서 계산한 start가 입력한 goal보다 작을 경우
        res += 1 # 도착횟수를 증가
    else:
        res += 1
        break
print(res)

📌 0부터 목표지점의 범위까지, 시작지점(start) + 도착횟수(res) * 공차(6) 값을 변수 start에 저장하고 입력받은 goal과 비교한다.

📌 goal보다 작을 경우에 도착횟수(res)의 값을 1증가시키고 반복한다.

📌 goal보다 크거나 같을 경우에 도착횟수의 값을 1증가시키고 반복문을 종료하고 출력한다.

관심있을 포스팅