백준 2292번_파이썬 알고리즘
Q. 백준 2292. 벌집
위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
(1) 입력 : 첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.
(2) 출력 : 입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.
입력 예시 | 출력 예시 |
13 | 3 |
A. 풀이
# Q 백준 2292. 벌집 ★★
# 6 12 18 24 30 36
# 1 7 19 37 61 91 127
# 0 6 18 36 60 90 126
# 1 2 3 4 5 6 7
N = int(input())
cnt = 0
sum = 1
def mul6(x):
return x * 6
if N == 1:
print(1)
else:
while sum < N:
sum += mul6(cnt)
cnt += 1
print(cnt)
- 벌집의 중앙부에서 해당 지점까지 최소로 방에 도달할 때, 지나가는 방의 수를 계산하는 문제이다.
- 먼저 규칙을 확인해보면, 가운데 부터 각 방을 한 바퀴 회전하며 숫자가 1씩 증가하고, 각 층의 가장 마지막 수는 (1, 7, 19, 37, 61, 91, 127, ...)이다. 이 수들의 증감량은 (6, 12, 18, 24, 30, 36, ...)이다. 이 규칙을 활용하여 문제를 풀이하려 한다.
1) 변수 선언부
- 먼저 도달해야 하는 방의 숫자를 int(input())을 활용해 입력받는다.
- 각 층수는 cnt라는 변수를 생성하여 담으려 한다. 초기값은 0으로 잡았다. (cnt = 0)
※ Tip(1) :
2) 함수 선언(def mul6(x))
- 함수 mul6에서는 변수를 받아 6을 곱한다.
※ Tip(1) :
3) 조건문 (if문)
- 입력받은 숫자 N이 1일 경우 1층이므로 1을 반환해주고, 아닌 경우는 else문에서 계산하도록 하였다.
4) 반복문(while문)
- if문의 else:에서는 해당되는 층수를 구하기 위한 계산을 True일 경우 반복한다.
- 만약 지정한 sum값 1ㅂ보다 N이 클 경우, cnt를 함수에 담아 sum에 담는다.
- 계산을 완료하면 cnt에도 1을 더하고 다시 while문을 반복한다.
이 식을 반복할 경우 sum에는 0 + 6 + 12 + 18 + ... 식으로 합이 쌓인다.
또한, cnt 변수(층수)는 방 번호에 따라 1, 2, 3, 4, 5,. ..순으로 증가하게 된다.
R. 리뷰
- 규칙 이해가 선행되어야 풀 수 있는 문제였다.
- 증가하는 값을 변수에 저장하고, 규칙에 따라 적절히 증감시키는 것이 중요했다.
- 함수를 사용해보았지만, 사실 함수를 사용하지 않고도 간단하게 풀이할 수 있다.
'DEV > 백준 알고리즘' 카테고리의 다른 글
백준 알고리즘 2775번(파이썬) (0) | 2022.10.16 |
---|---|
백준 알고리즘 2869번(파이썬) (1) | 2022.10.15 |
백준 알고리즘 1712번(파이썬) (0) | 2022.10.13 |
백준 알고리즘 1316번(파이썬) (0) | 2022.10.12 |
백준 알고리즘 2941번(파이썬) (0) | 2022.10.11 |
댓글