제민
17822 원판 돌리기 본문
https://www.acmicpc.net/problem/17822
17822번: 원판 돌리기
반지름이 1, 2, ..., N인 원판이 크기가 작아지는 순으로 바닥에 놓여있고, 원판의 중심은 모두 같다. 원판의 반지름이 i이면, 그 원판을 i번째 원판이라고 한다. 각각의 원판에는 M개의 정수가 적혀
www.acmicpc.net
사실 구현은 진작에 마쳤는데 double형 변환 이슈로 고생했다.
그리고 빈 값을 0x7f777777으로 했는데 -1로 하는게 낫지 않았을까??
그리고 빈 값을 0으로 하면 문제가 생길까?
생각할 거리가 좀 많았다.
다른 구현 문제들보다 쉬웠던 느낌이 든다.
덱으로 구현했는데 배열 rotate가 더 쉬웠을 수도 있겠다.
#include <bits/stdc++.h>
using namespace std;
int n,m,t;
deque<int> deq[52];
int dy[4]={1,0,-1,0};
int dx[4]={0,1,0,-1};
queue<pair<int,int>> Q; //0으로 만들 값 좌표 저장함
int deletedCnt=0;
void printtest(){
for(int i=1;i<=n;i++){
for(int j=0;j<m;j++){
cout<<deq[i][j]<<' ';
} cout<<'\n';
} cout<<'\n';
}
int getSum(){
int ret=0;
for(int i=1;i<=n;i++)
for(int j=0;j<m;j++)
if(deq[i][j]!=0x7f777777) ret+=deq[i][j];
return ret;
}
void CLW(int idx){
int val=deq[idx].back();
deq[idx].pop_back();
deq[idx].push_front(val);
}
void CCW(int idx){
int val=deq[idx].front();
deq[idx].pop_front();
deq[idx].push_back(val);
}
void deleteSurroundArea(){
bool deleted=false;
for(int depth=1;depth<=n;depth++){
for(int i=0;i<m;i++){
int cur=i; int nxt=i+1; if(nxt==m) nxt=0;
if(deq[depth][cur]==0x7f777777) continue;
if(deq[depth][cur]==deq[depth][nxt]){Q.push({depth,cur}); Q.push({depth,nxt});}
if(depth!=n){if(deq[depth][cur]==deq[depth+1][cur]){Q.push({depth,cur}); Q.push({depth+1,cur});}}
}
}
while(!Q.empty()){
auto cur=Q.front(); Q.pop();
deq[cur.first][cur.second]=0x7f777777;
deleted=true;
}
int mod=0;
for(int i=1;i<=n;i++)
for(int j=0;j<m;j++)
if(deq[i][j]!=0x7f777777) mod++;
if(!deleted){
double standard=((double)getSum()/mod);
for(int i=1;i<=n;i++){
for(int j=0;j<m;j++){
if(deq[i][j]==0x7f777777) continue;
if((double)deq[i][j]>standard) deq[i][j]--;
else if((double)deq[i][j]<standard) deq[i][j]++;
}
}
}
}
int main(){
ios::sync_with_stdio(0); cin.tie(0);
cin>>n>>m>>t;
for(int i=1;i<=n;i++){
for(int j=0;j<m;j++){
int val; cin>>val;
deq[i].push_back(val);
}
}
while(t--){
int x,d,k; cin>>x>>d>>k;
for(int i=x;i<=n;i+=x){
if(d==0) {for(int rot=0;rot<k;rot++){ CLW(i);}} //시계방향 회전
if(d==1) {for(int rot=0;rot<k;rot++){ CCW(i);}} //반시계 회전
}
deleteSurroundArea();
}
cout<<getSum();
return 0;
}
'코테연습일지 > 구현 (시뮬레이션)' 카테고리의 다른 글
15685 드래곤 커브 (4) | 2024.03.07 |
---|---|
20055 컨베이어 벨트 위의 로봇 (0) | 2024.03.06 |
17406 배열 돌리기 4 (4) | 2024.03.05 |
17825 주사위 윷놀이 (0) | 2024.03.04 |
19235 모노미노도미노 (0) | 2024.03.03 |