[C] 백준 2292번 (벌집)

Wook's Notepad·2022년 2월 7일
0
post-thumbnail

이번 문제에서 솔직히 가장 많은 시간을 사용했던 것 같다...

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

이 문제를 해결 하는 것인데 우선 내가 작성한 코드는

#include <stdio.h>

int main(){
	int a = 0;
	int b = 1;
    int i;

	
	scanf("%d",&a);
	
	for(i = 1; a>b; i++){
		b += i*6;
	}
	
	printf("%d",i);
	
	return 0;
}

우선, 문제의 벌집 구조를 보면 규칙이 존재한다.
설명에선 1번 벌집을 1번 방이라고 부르기로 한다.

방 번호(해당하는 방의 갯수) -> 거쳐가는 최소 방의 갯수
1 (0) -> 1
2~7 (6) -> 2
8~19 (12) -> 3
20~37 (18) -> 4
38~61 (24) -> 5
...

이처럼 해당하는 방의 갯수가 6의 배수꼴로 증가할때마다 거쳐가는 최소 방의 개수가 증가함을 알 수 있다.

따라서, 방 번호를 입력받고 그 방 번호에 해당하는 결과를 도출하기 위해서는 for문 구조를 활용하면 된다.

우선 거쳐가는 방의 갯수를 i로 가정하고, 해당하는 방의 갯수가 6의 배수이므로 입력받은 숫자 a가 a<b를 만족할때까지 b에 6을 계속 더해주고, 한번 6을 더해줄때마다 i를 1씩 증가시킨다. 이때, 시작점인 1번 방 또한 거쳐가는 방으로 카운트하기 때문에 변수 b=1로 설정해줘야만한다.

설명을 잘 못해서 주절주절 문장이 긴데 양해 부탁드립니다.. ㅠㅠ

0개의 댓글