문제
위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
입력
첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.
출력
입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.
예시
13 > 3
입력값 | 방의 개수 | 식 |
---|---|---|
1 | 1 | 6*0 + 1 |
2~7 | 2 | 1+6 = 6*0 + 6*1 = 6*(0+1) + 1 |
8~19 | 3 | 1+6+12 = 6*0 + 6*1 + 6*2 = 6*(0+1+2) + 1 |
20~37 | 4 | 1+6+12+18 |
38~61 | 5 | 1+6+12+18+24 |
순열
f(n) = 6 n + f(n-1)
f(n-1) = 6 (n-1) + f(n-2)
...
f(0) = 1
조건
f(i) < N <= f(i+1)
result = i+1;
예
f(0) < 4 =< f(1)
n = 1;
#include <stdio.h>
int bee(int num) {
if (num == 1) {
return 1;
} else {
return (6 * (num - 1) + bee(num - 1));
}
}
int main() {
int N, i;
scanf("%d", &N);
for (i = 1; ; i++) {
bee(i);
bee(i + 1);
if (bee(i) < N <= bee(i + 1)) {
printf("%d", i + 1);
break;
}
}
return 0;
}
결과는 틀렸습니다.
A < B < C (X)
A < B && B < C (X)
아주 기본적인 문법 실수를 했다...
#include <stdio.h>
int bee(int num) {
if (num == 1) {
return 1;
} else {
return (6 * (num - 1) + bee(num - 1));
}
}
int main() {
int N, i;
scanf("%d", &N);
for (i = 1; ; i++) {
bee(i);
bee(i + 1);
if (bee(i) < N && N<= bee(i + 1)) {
printf("%d", i + 1);
break;
}
}
return 0;
}
결과는 틀렸습니다
입력한 값이 1인 경우를 생각하지 못했다.
저 코드에 1을 입력한다면 출력값이 나오지 않는다.
#include <stdio.h>
int bee(int num) {
if (num == 1) {
return 1;
} else {
return (6 * (num - 1) + bee(num - 1));
}
}
int main() {
int N, i;
scanf("%d", &N);
for (i = 1; ; i++) {
bee(i);
bee(i + 1);
if (bee(i) < N && N <= bee(i + 1)) {
printf("%d", i + 1);
break;
} else if (bee(i) == N) {
printf("%d", i);
break;
}
}
return 0;
}
결과는 맞았습니다!