본문 바로가기

문제풀이

[C언어] 백준 2292 벌집

 


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;
}