벌집 성공출처분류
시간 제한 |
메모리 제한 |
제출 |
정답 |
맞은 사람 |
정답 비율 |
2 초 |
128 MB |
44687 |
20515 |
17894 |
46.338% |
https://www.acmicpc.net/problem/2292
문제
위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 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 참고해주세요🙏
최종 소스코드
'코딩테스트 > 백준 알고리즘' 카테고리의 다른 글
백준 알고리즘 | 2869 : 달팽이는 올라가고 싶다 (Python / 파이썬) (0) | 2020.09.22 |
---|---|
백준 알고리즘 | 1193 : 분수찾기 (Python / 파이썬) (0) | 2020.09.22 |
백준 알고리즘 | 1316 : 그룹 단어 체커 (Python / 파이썬) (0) | 2020.09.21 |
백준 알고리즘 | 2941 : 크로아티아 알파벳 (Python / 파이썬) (0) | 2020.09.21 |
백준 알고리즘 | 5622 : 다이얼 (Python / 파이썬) (0) | 2020.09.21 |
댓글