프로그래밍 언어/C

C언어 백준 2292 벌집 풀이

happy_life 2021. 9. 16. 18:04

https://www.acmicpc.net/problem/2292

 

2292번: 벌집

위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌

www.acmicpc.net

 

 

문제

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

 

 

풀이

 

이 숫자들은 각 최소 거리가 같다. (특정한 길이에서의 최소길이 = 원 이라는 아이디어에서 파생)

범위 방의 최소 개수 숫자의 개수
2~7 2 6(6*1)
8~19 3 12(6*2)
20~37 4 18(6*3)
38~61 5 24(6*4)
62~91 6 30(6*5)

 

범위(등비수열,등차수열 )

3n(n+1) + 2  3n(n+1) + 2 +6n +5

방의 최소 개수: n+2 

 

정답코드

#include <stdio.h>

int main() {
	int N;
	scanf("%d", &N);
	
	for (int n =0; n*(n+1) < 1000000000; n++)
	{
		int a = 3*n*(n + 1);
		
		if (N == 1)
		{
			printf("%d", N);
			break;
		}
		if ((a + 2) <= N && N <= (a + 6*n + 7))
		{
			printf("%d", n + 2);
			break;
		}
		
	}
	

	

	return 0;
}

코드분석

 

3n(n+1) +2<=N<=3n(n+1) +2 + 6n +5 인 경우

n+2 값을 출력해주면 방의 최소 개수가 도출된다는 논리를 활용하였다.

하지만 if 조건절은 N =1 인 경우가 포함 되지 않으므로 따로

if문을 만들어 주었다.

for 문 범위는 큰 의미 없으니 신경쓰지 않아도 된다.