위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.
입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.
규칙을 찾아내면 굉장히 쉬운 문제이다.
위 그림처럼 테두리친 부분을 1개의 서클이라고 생각하면
1서클에는 1
2서클에는 2 ~ 7
3서클에는 8 ~ 19
4서클에는 20 ~ 37
...
이렇게 들어가있다.
서클의 시작하는 숫자끼리 서로 비교해보면
1 -> 2 : 6⁰만큼 증가
2 -> 8 : 6¹만큼 증가
8 -> 20 : 6²만큼 증가
...
서클의 최소 숫자 = 이전 서클의 최소 숫자 + 6의 n제곱만큼 증가한다.
이 규칙을 적용한 반복문을 이용하면 입력받은 수가 어느 서클에 속하는지 알 수 있다.
또 지나야하는 방의 수는 서클의 번호와 동일함으로 바로 답을 구 할 수 있다.
#include <stdio.h>
int find_circle(int x)
{
int i = 2;
int a = 6;
int circle_num;
while (1)
{
if (i <= x && x < i + a)
break;
i += a;
a += 6;
}
circle_num = (a / 6) + 1;
return (circle_num);
}
int main(void)
{
int x;
int circle_num;
scanf("%d", &x);
if (x == 1)
circle_num = 1;
else
circle_num = find_circle(x);
printf("%d", circle_num);
}
main문에 한 번에 넣어서 코드를 짤 수도 있었지만 기능별로 나누는 연습을 해보았다.