코딩 테스트

[코딩테스트 19일차] BAEKJOON 2292번 : 벌집

sunlight-dby 2025. 5. 17. 02:39

[BAEKJOON 2292번 : 벌집]

[문제]


[고찰]

아래의 코드는 제가 정답으로 제출한 코드입니다.

2번부터 7번, 8번부터 19번, 29번부터 37번 등, 2 + (6 x i)번 부터 7 + (6 x (i + 1))번까지로 규칙을 가지고 있습니다.

그래서 min과 max를 각각 2와 7로 설정하고, 무한 루프문에서 답으로 출력될 answer을 1씩 더하고, 규칙을 만족하는지 확인합니다.

다만, 입력 값이 1이라면 그에 대한 출력 값 역시 1이므로 예외 처리를 따로 해주었습니다.

#include <iostream>

using namespace std;

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);

	int n;
	cin >> n;

	int answer = 1;

	int min = 2, max = 7;

	int i = 1;

	while(1)
	{
		answer++;
		if (n == 1)
		{
			cout << 1;
			return 0;
		}
		if (n >= min && n <= max)
		{
			cout << answer;
			return 0;
		}

		min += (6 * i);
		max += (6 * (i + 1));
		i++;
	}
}

 

다른 분의 풀이를 보니, 더 간단한 방법이 있어 아이디어와 함께 답을 정리해보려고 합니다.


[개념]

생각을 해보니 새로운 레이어의 방 끝 부분을 기준으로만 해도 괜찮았을텐데, 저는시작 부분부터 끝 부분까지 모두 기준으로 삼았었습니다. 그리고 입력 값이 1일 때의 예외 처리를 따로 했었는데, 기준을 끝 부분으로 한다면, 1 + (6 x i) 꼴이 되기 때문에 1일 때의 예외 처리를 따로 하지 않아도 됩니다.


[정리]

기준을 더 간단히 할 수 있는지 한 번더 고민해보는 자세를 가져야 할 것 같습니다.


[Solution]

#include <iostream>

using namespace std;

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);

	int n;
	cin >> n;

	int answer = 1;

	int max = 1;

	while(max < n)
	{
        max += 6 + answer;
        answer++;
	}
    
    cout << answer;
}