입력으로 숫자 N이 주어지고, 중앙의 방 1부터 N번 방까지 최소 개수의 방을 지나서 갈 때 몇개의 방을 지나가는지를 구하는 문제이다.
N(1 ≤ N ≤ 1,000,000,000)
문제를 처음 확인했을 때 굉장히 이상한 방법으로 접근했다.
이상한 직선 거리에 꽂혀서 1 6 17 34 방과의 관계 이런거나 계산하고 있었던 것.
일단 위의 방법으로는 문제를 풀 수 없는게 1과 직선 위치에 있는 방은 어찌저찌 구할수는 있겠지만, 그 외의 위치에 있는 방들은 구하기가 애매해진다.
만약 구했다고 하더라도 최소 거리가 아닐 확률이 높다.
당시에 당황해서 문제 푸는 것을 미뤘다. 다행히 이후 문제를 다시 봤을 때 아이디어가 떠올랐다.
벌집의 방들이 1을 중심으로 나이테처럼 둘레를 이루고 있다고 생각해보자.
같은 둘레에 위치하면 1과의 거리는 항상 같다.
아래 그림을 보고 1과 2둘레 떨어진 13과 8의 거리가 몇인지 계산해보자.
두 방의 거리가 같음을 쉽게 알 수 있다.
결국 해당 문제는 N번 방의 위치가 몇 번째 둘레에 있는지를 구하는 문제였다.
첫 번째 둘레에 있는 방 개수는 6개이며, 둘레가 1씩 커질 때마다 방의 개수도 6개 더 늘어난다.
이를 고려하여 다음과 같이 코드를 작성했다.
import sys
n = int(input())
distance=1
ns=6
if n//1 == 1:
print(distance)
sys.exit()
n -= 1
while n > 0:
n -= ns
ns += 6
distance += 1
print(distance)
구할 방의 번호는 변수 n으로 받는다.
n이 1일때 지나가는 방의 개수는 1이므로 distance를 1로 초기화 했다.
한 둘레의 방 개수는 변수 ns로 저장하며 첫 둘레의 방 개수인 6으로 초기화 했다.
n이 1이면 distance를 출력하고 바로 프로그램을 종료한다.
n이 1이 아니면 1을 빼고 while문을 실행한다.
n에서 ns(둘레)만큼을 뺀 뒤 ns에는 6을 더하고 distance(거리)를 1 추가한다.
이를 n이 0 이하가 될 때까지 반복한다.
이후 n번 방이 위치한 둘레에 도달하면 while문을 빠져나갈 것이다.
그러면 distance를 출력하고 프로그램을 종료한다.
n의 입력값이 1인 경우 아래의 코드를 실행할 필요 없이 distance를 출력 후 프로그램이 종료되어야 한다.
이 경우 4 가지 방법으로 실행도중 프로그램을 종료시킬 수 있다.
import 할 필요가 없다.
quit()
로 종료 작업을 수행할 경우 실행 중이던 프로그램 뿐만 아니라 python 쉘까지 완전히 닫아버린다.
import 할 필요가 없다.
exit()
로 종료 작업을 수행할 경우 실행 중이던 프로그램 뿐만 아니라 python 쉘까지 완전히 닫아버린다.
import sys
를 해주어야 한다.
쉘까지는 날리지 않으면서 프로그램만 정상적으로 종료시킬 수 있다.
import os
를 해주어야 한다.
sys.exit()
와 같이 프로그램만을 종료할 수 있지만, os_exit()
에서는 인자로 상태 코드가 꼭 필요하다.
정상적인 종료를 의미할 경우 os.EX_OK
를 인자로 넘겨주면 된다.