문제
위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
입력
첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.
출력
입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.
예제 입력
13
예제 출력
3
시험기간에 머리 식힐 겸 풀어봤다. 규칙은 금방 찾았으나 코드로 어떻게 옮겨야하나 2시간(?) 동안 머리 터지는 줄 알았다.
방을 벗어나기 위한 거리를 육각형으로 묶었다.
빨 주 노 초로 갈수록 1씩 거리가 늘어나는 것이다.
분홍색 화살표로 표시한 부분은 육각형 범위를 벗어날 때 어떤 규칙이 있는지 알아보기 위해 표시했다.
1에서 2로 가는건 나중에 1을 더해버리고
2부터 시작한다고 생각하면 6, 12, 18 이런식으로 등비수열이 있다는 걸 알 수 있다.
고로 입력된 값을 따라잡는 어떤 규칙을 갖는 숫자를 만들어 비교하면 된다.
따라 잡는 동안 카운트를 해서 거리를 세준다.
그 규칙을 갖는 숫자에 1을 더한 값이 입력된 값보다 크다면 그때의 카운트가 답이 된다.
소스코드
N = int(input())
sum = 0
count = 0
while N > sum: #입력 값이 등비수열 6의 누적 값보다 큰 동안 반복
sum += count*6 #6의 배수를 누적
count +=1
if N <= sum+1: #누적된 값 +1 이 입력 값보다 크거나 같다면 같은 범위 안에 있는 것이므로
print(count) #거리를 출력한다
break #break로 while문에서 벗어난다
'알고리즘 문제' 카테고리의 다른 글
백준 알고리즘 중앙값 측정 9426번 틀림! (0) | 2017.11.14 |
---|---|
백준 알고리즘 2750번 수 정렬하기 (0) | 2017.11.12 |
백준 알고리즘 상수 2908번 (0) | 2017.11.02 |
백준 알고리즘 다이얼 5622번 (0) | 2017.11.02 |
백준 알고리즘 단어 공부 1157번 (0) | 2017.11.02 |