[BOJ] 2292 - 벌집

엄혜영·2024년 3월 17일
0
post-thumbnail

입력으로 숫자 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 가지 방법으로 실행도중 프로그램을 종료시킬 수 있다.

1. quit()를 사용하는 방법

import 할 필요가 없다.
quit()로 종료 작업을 수행할 경우 실행 중이던 프로그램 뿐만 아니라 python 쉘까지 완전히 닫아버린다.

2. exit()를 사용하는 방법

import 할 필요가 없다.
exit()로 종료 작업을 수행할 경우 실행 중이던 프로그램 뿐만 아니라 python 쉘까지 완전히 닫아버린다.

3. sys.exit()를 사용하는 방법

import sys 를 해주어야 한다.
쉘까지는 날리지 않으면서 프로그램만 정상적으로 종료시킬 수 있다.

4. os.exit([arg])를 사용하는 방법

import os 를 해주어야 한다.
sys.exit()와 같이 프로그램만을 종료할 수 있지만, os_exit()에서는 인자로 상태 코드가 꼭 필요하다.
정상적인 종료를 의미할 경우 os.EX_OK 를 인자로 넘겨주면 된다.


참고 자료

[Python] 프로그램 종료
exit와 sys.exit은 무슨 차이일까?

profile
누워있는게 좋은 완벽주의자

0개의 댓글

관련 채용 정보