위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
n = int(input()) # n = 13
num = 1 # 첫 번째 숫자
cnt = 6 # 증가하는 등차수열
room = 1 # 지나가는 방의 수
if n == 1:
print(1)
else:
while True:
num = num + cnt
room += 1
if n <= num:
print(room)
break
cnt += 6
풀이
벌집모양을 보고 문제의 규칙을 파악하고 가는 것이 좋다.
1 ~ 7 ~ 19 ~ 37 ~ 61
6 12 18 24
위와 같이 6씩 증가하는 등차수열임을 인식하고
6씩 증가해서 그 사이에 들어갈 때마다 방이 1개씩 증가한다는 것도 파악한 후 문제를 풀었다.
먼저 변수 n으로 수를 13으로 입력받고 num를 설정해서 처음 있는 위치인 1을 설정했다.
그 후 증가하는 등차수열을 세어줄 cnt 변수를 6으로 초기화하고
지나가는 방의 수를 알기 위해 변수 room을 처음 있는 위치와 동일하게 1로 설정했다.
다음으로 if문을 이용해서 입력받은 n이 1일 때는 그냥 바로 그 방의 위치인 1을 출력하도록 하고
나머지 경우에는 while 문을 사용해서 break가 나오기 전까지 계속 반복해줬다.
처음 위치의 1에서 처음 등차수열만큼 6을 더해주고, 그 뒤에는 방이 옮겨지니 room += 1을 해줬다.
그리고 나서 처음 입력받은 n의 수 13이 현재 위치인 num 7의 크기보다 작거나 같아졌을 때
현재있는 방의 위치인 room = 2를 출력하고 break하는 코드를 짰다.
하지만 입력받은 n의 수 13이 현재 위치인 num 7보다 큰 경우이기 때문에
다시 등차수열 6만큼 더해서 7 = 7 + 12 = 19가 되고 room 역시 +1이 또 증가해서 3이 된다.
이때 다시 if문을 만났을 때는 13 <= 19가 성립하기 때문에 room을 출력하고 break한다, 끝!👊
댓글