백준 문제풀이

2292 번 : 벌집

하다블 2023. 4. 25. 19:19
반응형

문제는 다음과 같습니다.

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

 

2292번: 벌집

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

www.acmicpc.net

 

풀이 코드는 다음과 같습니다.

#include <iostream>
#include <vector>

using namespace std;
#define ll long long

int main()
{
	ll total{1};
	vector<ll>v;
	v.push_back(total);
	int idx{1};
	while(total<=1000000000)
	{
		total+=(6*idx);
		v.push_back(total);
		idx++;
	}
	ll N;
	cin>>N;
	if(N==1)
		{
			cout<<1<<endl;
		}
	else
	{
		for(int i{1};i<v.size();i++)
		{
			if(v[i]>=N&&v[i-1]<N)
			{
				cout<<i+1<<endl;
				break;
			}
		}
	}
}

범위를 측정하다 보면 육각형의 벌집답게 규칙이 나오는데, 바로 지나가야 하는 방의 개수가 1 늘어날수록 갈 수 있는 방의 개수는 6의 배수로 커진다는 점입니다.

방 1개만 지나가서 갈 수 있는 곳은 1번뿐이고

2개의 경우에는 2~7번 방 , 3개의 경우에는 8~19번 방처럼인데 각각의 방의 개수가 1,6,12로 6의 배수로 커짐을 알 수 있습니다. 이를 이용하여 벡터에 N개 방을 지나서 갈 수 있는 방을 vector에 넣어서 확인할 수 있습니다.

숫자가 1,000,000,000으로 굉장히 크지만 while문을 사용해도 6의 배수로 커지고 while문 안에 더 복잡한 과정이 없으므로 충분히 해결할 수 있는 문제입니다.

반응형

'백준 문제풀이' 카테고리의 다른 글

2869 번 : 달팽이는 올라가고 싶다  (0) 2023.04.26
2903 번 : 중앙 이동 알고리즘  (0) 2023.04.25
2720 번 : 세탁소 사장 동혁  (2) 2023.04.25
11005 번 : 진법 변환 2  (2) 2023.04.25
2745 번 : 진법 변환  (0) 2023.04.25