문제
https://www.acmicpc.net/problem/2292
육각형으로 이루어진 벌집이 있고, 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호가 주어진다. 이때 1에서 N번 방 까지 갈때 몇개의 방을 지나는지 구하는 문제
풀이
1을 기준으로 주변에 방은 6, 12, 18 ...개씩 6의 구구단 형식으로 늘어나는 것을 볼 수 있다.
이를 활용하면 정수 N이 주어졌을 때 1로부터 몇 칸 떨어져 있는지 구할 수 있다.
1 => 1
2~7 => 1+(1~6) *1로 부터 같은거리 만큼 떨어져 있는 수는 6개
8~19 => 1+6+(1~12) *1로 부터 같은거리 만큼 떨어져 있는 수는 12개
20~37=> 1+6+12+(1~18) *1로 부터 같은거리 만큼 떨어져 있는 수는 18개
...
1칸 떨어지면 6*1개의 수가 있고, 2칸 떨어진 곳에는 6*2개의 수가 있으므로, 이를 활용하면 몇 칸 떨어져있는지 계산 할 수 있다. 정수 N에서 2를 빼고 6으로 나눈 몫에 1을 더하면 1에서 몇 칸 떨어져 있는지 알 수 있다.
2~7 => 1칸 ((N-2)//6) + 1 == 1
8~19 => 2칸 2,3 ((N-2)//6) + 1 == 2,3
20~ 37=> 3칸 4,5,6 ((N-2)//6) + 1 == 4,5,6
...
여기서 1부터 N까지 더하는 규칙*을 활용하면
*(1=1), (1+2=3), (1+2+3 = 6)
1에서 3칸 떨어진 수의 ((N-2)/6)의 범위는
1+2 <((N-2)/6) <= 1+2+3 으로 나타남을 볼 수 있다.
1까지 포함한 칸의 수를 세면 정답이 나오므로 이를 코드로 바꿔서 작성했다.
Code
N=int(input()) #2~7(0~5) =>2 8~19(6~17) =>3 20~37=>4
if N==1:
print(1)
else :
N_6=int((N-2)/6)+1
i=0
while True:
i +=1
N_6-=i
if N_6<=0:
break
print(i+1)
i가 1, 2, 3, 4 순으로 증가하며 칸을 찾아준다.
'Algorithm > BAEKJOON' 카테고리의 다른 글
[백준/Python] 17070번 - 파이프 옮기기1 (0) | 2024.01.02 |
---|---|
[백준/Python] 17136번 - 색종이 붙이기 (0) | 2024.01.02 |
[백준/Python] 2566번 - 최대값 (0) | 2024.01.02 |
[백준/Python] 18870번 - 좌표 압축 (0) | 2024.01.02 |
[백준/Python] 11653번 - 소인수분해 (1) | 2024.01.02 |