문제
위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
입력
첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.
출력
입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.
풀이
n = int(input())
sum = 1
i = 1
while(n != 1):
sum += 6*i
if sum >= n:
break
i += 1
if n == 1:
print(1)
else:
print(i+1)
문제를 언뜻 보면 최단거리 구하기 같지만, 단순하게 육각형이 점점 더 커진다고 생각했을 때 주어진 숫자가 몇 번째 육각형에 있는지를 구하면 된다.
1 | 1 | |
2 | 2~7 | +6 |
3 | 8~19 | +12 |
4 | 20~37 | +18 |
5 | 38~61 | +24 |
위 표와 같이 1부터 시작해서 +6, +12, +18,,, 6n만큼 커져가며 육각형을 이룬다.
입력되는 수의 범위는 1 ≤ N ≤ 1,000,000,000 이니까 시간복잡도 측면에서도 2초면 충분하다고 판단된다.
그러니까 while문으로 직접 육각형을 그려가면서, 주어진 숫자가 위치한 육각형에 다다르면 break하고 n+1을 출력해주자!
생각
진짜 간단한데 입력이 1일 때 예외처리를 해주지 않아 틀렸다..^ㅡ^
언제쯤 꼼꼼하게 모든 케이스를 맞출 수 있을까!
'👩🏻💻 Front-end > 👾 Algorithm' 카테고리의 다른 글
백준 2869 - 달팽이는 올라가고 싶다 (Python) (0) | 2022.05.07 |
---|---|
백준 1193 - 분수찾기 (Python) (0) | 2022.05.05 |
백준 1712 - 손익분기점 구하기 (Python) (0) | 2022.05.05 |
백준 2941 - 크로아티아 알파벳 (Python) (0) | 2022.05.03 |
백준 1157 - 단어공부 (Python) (0) | 2022.05.02 |