승코딩당당당

[C++] 백준 2292: 벌집 본문

PS/BOJ

[C++] 백준 2292: 벌집

승코딩당당당 2025. 12. 29. 11:26

문제

[C++] 백준 2292: 벌집 BRONZE 2
https://www.acmicpc.net/problem/2292

 


 

접근 방법

이 문제는 벌집 모양으로 숫자가 증가할 때,
주어진 숫자 n이 몇 번째 껍질(층) 에 속하는지를 구하는 문제이다.

 

먼저 직접 숫자들의 범위를 나열해보면 다음과 같은 규칙을 확인할 수 있다.

1
2 ~ 7
8 ~ 19
20 ~ 37
38 ~ 61

 

각 층이 커질수록 증가하는 칸의 개수는 6의 배수로 증가한다는 패턴이 있다.

1
6 
12
18
24
  • 1층: 1
  • 2층: 1 + 6×1
  • 3층: 1 + 6×1 + 6×2
  • 4층: 1 + 6×1 + 6×2 + 6×3 …

즉, 이런 방식으로 이전 범위의 끝값에 6 × i를 더해가며 범위를 확장하면 된다.

 

코드에서는 각 층의 마지막 숫자를 벡터에 저장하고 n이 해당 범위 안에 들어오는 순간 반복을 종료한다.
최종적으로 n이 포함된 층 번호를 출력한다.

 

구현 시 주의할 점

  • 입력값 n이 1인 경우는 예외 처리가 필요하다.
    이 경우 무조건 1층이다.
  • 벌집 숫자가 커질 수 있으므로 long long 타입을 사용해야 안전하다.

 


 

코드

#include <iostream>
#include <vector>
using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	long long int n = 0;
	cin >> n;

	vector<long long int> honeycomb;
	honeycomb.push_back(1);

	int index = 0;
	int i = 1;
	while (n != 1)
	{
		long long int range = honeycomb[index] + 6 * i;  // 범위의 끝
		honeycomb.push_back(range);

		if (n <= range)
			break;

		index++;
		i++;
	}
	if (n == 1)
		cout << 1;
	else
		cout << i + 1;

	return 0;
}

'PS > BOJ' 카테고리의 다른 글

[C++] 백준 1157: 단어 공부  (0) 2025.12.29
[C++] 백준 1927: 최소 힙  (0) 2025.12.29
[C++] 백준 5073: 삼각형과 세 변  (0) 2025.12.28
[C++] 백준 23971: ZOAC 4  (2) 2025.12.28
[C++] 백준 1253: 좋다  (1) 2025.12.26