![]() |
minNum | n | maxNum | |
1 | 0 | 1 | 2 + 6 * 0 - 1 | |
2 | 1 | 7 | 2 + 6 * 1 - 1 = 1 + 6 |
|
8 | 2 | 19 | 8 + 6 * 2 - 1 = 1 + 6 + 12 |
|
20 | 3 | 37 | 20 + 6 * 3 - 1 = 1 + 6 + 12 + 18 |
|
38 | 4 | 61 | 38 + 6 * 4 - 1 = 1 + 6 + 12 + 18 + 24 |
|
62 | 5 | 91 | 62 + 6 * 5 - 1 = 1 + 6 + 12 + 18 + 24 + 30 |
|
92 | 6 | 127 | 92 + 6 * 6 - 1 = 1 + 6 + 12 + 18 + 24 + 30 + 36 |
|
minNum = minNum + 6 * n |
- 하나의 육각형을 만드는 첫번째 숫자가 일정한 패턴을 가지고 증가하고 있는 걸 파악할 수 있다.
- 또한 이 n번째는 시작점과 끝을 포함하여 가장 빨리 도달하기 위한 방의 개수와 동일하다.
- 1: 1
- 2: 2 3 4 5 6 7
- 3: 8 9 10 11 12 13 14 15 16 17 18 19
- 4: 20 21 22 23 24 25 .... 34 35 36 37
- ....
- n의 값이 무엇이든 간에 (기존의 값 + 6n -1) 까지가 n번째 육각형의 최대값이다.
- n번째 육각형의 최소값은 직전 육각형의 최소값 + 6n
- y = y + 6n
- 루프를 통해 y 계산식을 몇번을 반복해야 처음 입력받은 수 num을 초과하는지를 계산한다.
- while (num > sum)
n번째 육각형에서 올 수 있는 최대 숫자 sum보다 입력받은 값 num이 여전히 크다면, 여전히 방의 최종 개수 n까지 오지못했다
참고 코드
#include <stdio.h>
int main(void)
{
int num, sum = 1, n = 1; // sum의 초항 1로 초기화
// num이 뭐가됐든 시작점, 최소 1개의 방이 필요하다.
scanf("%d", &num);
while (num > sum) // num이 sum보다 크다면 최소 하나의 방이 더 필요하다
{
sum += n * 6; // n번째 육각형을 만드는 num의 최대값: 7 19 37 61 91 127 ...
n++;
}
printf("%d", n);
return 0;
}
내 코드
#include <stdio.h>
int main(void)
{
int num, n = 1;
scanf("%d", &num);
while (num > 1) // num이 최초의 초항 1보다 크다면 최소 첫번째 육각형이므로
{
num -= 6 * n; // n번째 증가분을 차감
n++; // 방의 개수를 1 증가
}
printf("%d", n);
return 0;
}
'문제풀이' 카테고리의 다른 글
[C언어] 백준 1193 분수찾기 (0) | 2021.12.28 |
---|---|
[C언어] 백준 10250 ACM호텔 (0) | 2021.12.27 |
[C언어] 백준 1712 손익분기점 (0) | 2021.12.24 |
[C언어] 백준 1316 그룹 단어 체커 (0) | 2021.12.24 |
[C언어] 백준 2941 크로아티아 알파벳 (0) | 2021.12.22 |