[백준/C언어] 2292번 벌집

EOH·2023년 2월 21일
0

백준

목록 보기
3/5
post-thumbnail


문제


위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.

입력

첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.

출력

입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.


설명

규칙을 찾아내면 굉장히 쉬운 문제이다.

위 그림처럼 테두리친 부분을 1개의 서클이라고 생각하면
1서클에는 1
2서클에는 2 ~ 7
3서클에는 8 ~ 19
4서클에는 20 ~ 37
...

이렇게 들어가있다.
서클의 시작하는 숫자끼리 서로 비교해보면
1 -> 2 : 6⁰만큼 증가
2 -> 8 : 6¹만큼 증가
8 -> 20 : 6²만큼 증가
...
서클의 최소 숫자 = 이전 서클의 최소 숫자 + 6의 n제곱만큼 증가한다.

이 규칙을 적용한 반복문을 이용하면 입력받은 수가 어느 서클에 속하는지 알 수 있다.
또 지나야하는 방의 수는 서클의 번호와 동일함으로 바로 답을 구 할 수 있다.

코드

#include <stdio.h>

int find_circle(int x)
{
	int i = 2;
	int a = 6;
	int circle_num;

	while (1)
	{
		if (i <= x && x < i + a)
			break;
		i += a;
		a += 6;
	}
	circle_num = (a / 6) + 1;
	return (circle_num);
}

int main(void)
{
	int x;
	int circle_num;

	scanf("%d", &x);
	if (x == 1)
		circle_num = 1;
	else
		circle_num = find_circle(x);
	printf("%d", circle_num);
}

p.s.

main문에 한 번에 넣어서 코드를 짤 수도 있었지만 기능별로 나누는 연습을 해보았다.

profile
에-오

0개의 댓글