- C언어 : 기본수학1(2)
03.JUL.2022

숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을
지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개,
58까지는 5개를 지난다.
#include <stdio.h>
int main() {
int n, i = 1, room = 1, preRoom = 1;
scanf("%d", &n); // 이동할 방의 숫자 n을 입력받기
if (n == 1) { // 1번 방까지 이동은 1번 이동 출력
printf("1");
return 0;
}
// 시작점 : 1번 방(이동 1칸)
// +1칸 이동할 수 있는 방 : +6 --> ~7번 방까지는 2칸 걸려 이동 가능
// +2칸 이동할 수 있는 방 : +6+12 --> ~19번 방까지는 3칸 걸려 이동 가능
while (1) {
room += 6 * i;
preRoom += 6 * (i - 1);
i++; // i++ 위치 주의
if (n <= room && n>preRoom) {
printf("%d", i); // 몇 칸 이동했는지 출력
break;
}
}
}
시작점 1번 방에서 1번 방까지 이동하는 횟수는 1번이다.
1을 둘러싼 원의 숫자를 보면 7번까지의 숫자다. 즉 2칸을 이동했을 때 갈 수 있는 방은 7번 방 까지. 한 단계 더 감싼 원의 숫자가 19번까지의 숫자인 걸 보면, 3칸을 이동했을 때 갈 수 있는 방은 19번 방까지.
이걸 보니 일정한 규칙으로 이루어져 있다는 걸 알 수 있다.
첫 번째 원 : 1
두 번째 원 : 2~7 (숫자 6개)
세 번째 원 : 8~19 (숫자 12개)
.
.
.
한 칸씩 이동할 때마다 원을 이루는 숫자가 6*⬛만큼 늘어나는 것을 이용해 n번 방까지 몇 칸을 이동해 갈 수 있는지 구하도록 하자.
예를 들어 n의 값으로 13을 입력했다고 가정하고 while문으로 가보자.
i가 칸 이동 횟수라고 치자. 첫 번째에서 i=1이므로 room = 6이다. 이 숫자는 두 번째 원의 숫자 개수와 일치한다. 이 때는 if문이 성립되지 않으므로 넘어가고 다시 while을 돈다.
i = 2일 때 room = 18 이다. 이 숫자는 두 번째, 세 번째 원의 숫자 개수와 일치한다. 이때는 if문에서 n이 18>=n>6 식에 성립하므로 if문에 들어갈 수 있다.
주의해야 할 점은 i++ 위치.
우리가 필요한 칸의 이동 횟수는 i가 아닌 i+1이다. 그러므로 i++을 print 전에 두고 그 후에 i를 print해야 이동 횟수가 계산된다.