
Q. 위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. (예를 들면, 13까지는 3개, 58까지는 5개를 지난다.)
규칙성을 찾으면 간단하게 풀리는 문제다. 시계 방향으로 돌아가면서 매겨진 숫자들이 한 바퀴를 돈 육각 고리 모양의 모음을 한 층이라 할 때, 층의 마지막 숫자를 이어보자. 1, 7, 19, 37, 61… 다시 앞 숫자와의 차를 계산해 나열해보자. 6, 12, 18, 24… 빙고! 원하는 숫자가 몇 번째 층에 있는지는 쉽게 구할 방법이 생겼다.
그럼 한 층에 숫자가 여러 개인데 최단 거리는 어떻게 구하느냐…? 싶을 수 있는데, 중심인 1번에서 같은 층 안에 있는 숫자들로 향하는 최단 거리는 모두 똑같다. 못 믿겠으면 직접 하나하나 이어보자.
그러므로 코드는 이렇게 완성된다.
`// https://www.acmicpc.net/problem/2292 Baekjoon No.2292 벌집
#include <iostream>
using namespace std;
int main() {
int n;
int route = 1;
int tmp = 1;
cin >> n;
if (n != 1) {
while(1) {
if(tmp >= n) {
break;
}
tmp += route*6;
route++;
}
}
cout << route << endl;
return 0;
}`
Comments powered by Disqus.