출처 | https://www.acmicpc.net/problem/2292
위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.
입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.
핵심 아이디어
b숫자에서 1칸씩 늘어날 때마다, +6, +12, +18.. 이런 식으로 증가하는 걸 알 수있다.
따라서 while문에 i++을 진행해주면서, 6을 곱해주면서 진행했다.
또한 a숫자는 이전 b숫자보다 1이 크다는 걸 기억하자.
#include <stdio.h>
int main()
{
int i = 1; //방의 개수를 의미한다.
int sumA = 1, sumB = 1; //이것은 A | B 값에 대한 변수다.
int n;
scanf_s("%d", &n);
if (n == 1)
{
printf("1");
return 0;
}
while (1)
{
sumB = sumB + 6 * i;
sumA = sumA + 6 * (i - 1); //sumA에 대한 값은 이전 SumB의 값보다 1작다. 이 아이디어가 중요하다.
i++; //벌집 방을 늘린다. 1 -> 2 -> 3 요런식으로
if (n > sumA && n <= sumB)
{
printf("%d", i);
break;
}
}
}
참고 | https://velog.io/@kimmainsain/C%EC%96%B8%EC%96%B4-%EB%B0%B1%EC%A4%80-2292-%EB%B2%8C%EC%A7%91