[2292]백준 : 벌집(c)

지환·2022년 5월 5일
0

백준(C)

목록 보기
28/47
post-thumbnail

출처 | 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

profile
아는만큼보인다.

0개의 댓글