개발 지식/알고리즘

백준 2292 벌집 C++

Prcnsi 2022. 7. 26. 22:24
728x90

블하~ 안녕하세요. 오랜만에 글을 쓰는데 요즘 업로드가 뜸했던 것 같습니다.

지난 1학기 동안 생각지 못한 많은 걸 연구실에서 배운 것 같아 감사하게 생각하고 있습니다.

그래서 제가 블로그에 공유할거리들이 쌓여 있는데 제가 게을러서 요즘 잘 안 올렸네요.

앞으로는 더 꾸준하게 올려야겠습니다.

 


 

서론이 길었는데 오늘 제가 푼 문제는 백준 2292 벌집 문제입니다.

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

 

2292번: 벌집

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

www.acmicpc.net

 

우선 이 문제는 아래 벌집의 1이 적혀 있는 칸에서 시작해서 임의의 값이 들어왔을 때 그 값까지 몇 칸을 지나야 하는지 구하는 문제입니다.

 

풀이

이 문제는 벌집의 숫자가 주어졌을 때 그 숫자까지 가는데 몇 개의 방을 지나는지 구하는 문제입니다.

이 문제의 패턴은 아래와 같이 정리할 수 있습니다.

라인의 수 개수 이전 끝자리와 차이
1 1 1 x
2 2~7 6 +6
3 8~19 12 +12
4 20-37 18 +18
5 38~61 24 +24
6 62-91 30 +30

그럼 이제 위 패턴에서 마지막자리를 기준으로 입력받은 수가 마지막 자리보다 작으면 그 줄에 속하므로 그 줄을 출력하고 그 줄보다 크면 다음 줄로 끝자리 변수를 (라인의 개수)*6으로 더해주면서 무한루프를 돌리면 벌꿀집이 해당하는 곳에서 멈춰서 출력하게 됩니다. 

 

그래서 코드는 아래와 같이 됩니다! 

#include <iostream>
using namespace std;

int main() {
	int endValue = 1; // 벌꿀집 라인별 마지막 수를 기록할 변수
	int inputValue=0; // 입력 받은 값
	int line = 1; // 몇 번째 줄인지 기록할 변수;

	cin >> inputValue;

	while (1) {
		// 입력 받은 수가 줄의 마지막 수보다 작거나 같으면
		if (endValue >= inputValue) {
			// 그 라인에 있는 것으로 해석해
			cout << line << '\n';
			break;
		}
		// 입력 받은 수가 줄의 마지막 수보다 크다면 해당 라인보다 큰 줄에 있는걸로 해석해서
		else {
			endValue += line*6; // 줄의 마지막 수에 증가량을 더해 다음줄의 마지막 수 표현
			line += 1; // 그리고 다음 줄로 넘어감
		}
	}
	return 0;
}
728x90