반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
05-17 03:37
관리 메뉴

ImJay

[파이썬/Python] 백준 2292번 벌집 본문

Solved.ac - Python/CLASS 2

[파이썬/Python] 백준 2292번 벌집

ImJay 2023. 5. 7. 15:09
반응형

[파이썬/Python] 백준 2292번 벌집

 

2292번: 벌집

위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌

www.acmicpc.net


문제

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

입력

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

출력

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

예제 입력

13

예제 출력

3

풀이

import sys
input = sys.stdin.readline

# 입력 받기
n = int(input())

# 초기 방 개수와 카운트 변수 초기화
room = 1 # 방 개수 초기화
cnt = 1 # 라인 수 초기화

# 방의 수는 이전 라인의 수에 6을 곱한 값 만큼 증가한다.
while n > room:
    room += 6 * cnt # 해당 라인의 방 개수 계산
    cnt += 1 # 라인 수 증가

print(cnt) # 최소 라인 수 출력

해당 코드의 시간 복잡도는 O(sqrt(n)) 이다.

while문에서 6을 곱해가며 새로운 라인의 방 개수를 계산하고, n보다 크거나 같아질 때까지 반복한다. 이 때, 라인 수 cnt는 1씩 증가하게 된다.

n보다 크거나 같은 방 개수가 나오기까지 걸리는 라인 수는 sqrt(n)를 넘지 않는다. 예를 들어, n이 50일 경우 1부터 시작해서 1, 7, 19, 37, 61까지 방 개수가 증가한다. 이 때 61은 50보다 큰 수 중에서 가장 작은 방 개수이므로, 5번의 루프를 돌면서 최종 라인 수 5를 구할 수 있다.

따라서, 이 코드의 시간 복잡도는 O(sqrt(n))이다.

참고자료

 

백준 2292번 [파이썬 알고리즘] 벌집

[Python] 백준 알고리즘 온라인 저지 2292번 : 벌집 Python3 코드 n = int(input()) nums_pileup = 1 # 벌집의 개수, 1개부터 시작 cnt = 1 while n > nums_pileup : nums_pileup += 6 * cnt # 벌집이 6의 배수로 증가 cnt += 1 # 반복

ooyoung.tistory.com

반응형
Comments