본문 바로가기
코딩테스트/백준 알고리즘

백준 알고리즘 | 2292 : 벌집 (Python / 파이썬)

by 함께 공부해요 2020. 9. 21.


벌집 성공출처분류

시간 제한

메모리 제한

제출

정답

맞은 사람

정답 비율

2 초

128 MB

44687

20515

17894

46.338%

https://www.acmicpc.net/problem/2292

 

2292번: 벌집

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

www.acmicpc.net


문제

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

입력

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

출력

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

알고리즘 분류

수학


백준 알고리즘 # 2292번 : 벌집

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한다, 끝!👊

자세한 코드가 궁금하신 분들은 아래 GitHub 참고해주세요🙏

 

wook2124/Algorithm

Practice algorithm. Contribute to wook2124/Algorithm development by creating an account on GitHub.

github.com

최종 소스코드

댓글