https://www.acmicpc.net/problem/3678
육각형 모양의 경로를 생각해야하는 시뮬레이션 문제였습니다.
초기값 1을 넣어준후 주변 육각형 둘레로 감싸는 부분을 고려해서 풀었습니다. 바깥 육각형이 안쪽 육각형과 접하는 부분을 알아내야 하는데 저는 경로 순서를 좌표로 두고 각각 육각형의 변이 1씩 커지는걸 이용해서 안쪽과 바깥쪽 육각형 관계를 구했습니다.
육각형의 마지막을 이루는 타일은 첫 타일과 마주하므로 이에 주의하면 됩니다.
#include<stdio.h>
#include<vector>
#include<math.h>
#include<algorithm>
#include<bitset>
#include<string>
#include<iostream>
#include<map>
#include<set>
#include<stack>
#include<queue>
#include<functional>
using namespace std;
void fast_io() {
cin.tie(0)->sync_with_stdio(0);
}
int solve[30001];
int cnt[6];
int main(){
fast_io();
int T;
solve[0]=1;
cnt[1]=1;
int k=1;
bool chk=false;
for(int x=6;x<=5000;x+=6){
int base=k-(x-6);
for(int y=k;y<k+x;y++){
if(y>=10002){
chk=true;
break;
}
vector<int> v(6,0);
v[solve[y-1]]++;
if(y==k){
v[solve[y-(x-6)]]++;
}
else{
if(y==k+x-1) v[solve[k]]++;
if(y%(x/6)==0){
v[solve[base]]++;
}
else{
v[solve[base]]++;
v[solve[base+1]]++;
base++;
}
}
priority_queue<pair<int,int>> pq;
for(int z=1;z<=5;z++){
if(!v[z]){
//if(y==21) cout<<z<<" "<<cnt[z]<<'\n';
pq.push({-cnt[z],-z});
}
}
solve[y]=-pq.top().second;
cnt[solve[y]]++;
}
k+=x;
if(chk) break;
}
cin>>T;
while(T--){
int N;
cin>>N;
cout<<solve[N-1]<<'\n';
}
}
'PS > boj' 카테고리의 다른 글
백준 2069 보이는 산맥 (C++) (0) | 2022.07.15 |
---|---|
백준 1994 등차수열 (C++) (0) | 2022.07.14 |
백준 1744 수 묶기 (C++) (0) | 2022.07.12 |
백준 23325 마법천자문 (C++) (0) | 2022.07.10 |
백준 10838 트리 (C++) (0) | 2022.07.09 |