Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- BOJ 4485
- BOJ 2213
- javascript
- BOJ 2012
- springboot
- 분할과 정복
- DP
- Lambda
- AWS
- BOJ 2146
- BOJ 4948
- priority_queue
- 조합 알고리즘
- BOJ 1697
- Coercion
- BOJ 1074
- BOJ 6593
- 플로이드 와샬
- serverless
- BOJ 2167
- BOJ 2234
- spring security
- BOJ 1912
- BOJ 5791
- MySQL
- 다익스트라
- BOJ 11726
- BOJ 2407
- BOJ 5568
- BOJ 1926
Archives
- Today
- Total
고인물을 지양하는 블로그
BOJ 14499 주사위 본문
https://www.acmicpc.net/problem/14499
14499번: 주사위 굴리기
첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지도에 쓰여 있는 수가 북쪽부터 남쪽으로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 주사위를 놓은 칸에 쓰여 있는 수는 항상 0이다. 지도의 각 칸에 쓰여 있는 수는 10을 넘지 않는 자연수 또는 0이다. 마
www.acmicpc.net
2
4 1 3
5
6
전개도의 X. Y축을 각각 deque로 구현했다. 겹치는 바닥면은 주사위를 굴린 후 바뀐 X_ax[1], Y_ax[1](바닥면)를 동기화시켜주면 중복 문제는 해결된다.
deque의 push_front()/back(), pop_front()/back() 연산을 이용하면 주사위 굴리는 동작을 쉽게 나타낼 수 있다.
#include <iostream>
#include <deque>
using namespace std;
int x,y,N,M,K,dx[]={1,-1,0,0},dy[]={0,0,-1,1};
deque<short> X_ax, Y_ax; // X, Y축
bool bound(int x, int y) {return x>=0&&x<M&&y>=0&&y<N;}
void roll(int op) {
short y_f=Y_ax.front(), y_b=Y_ax.back();
switch(op) {
case 1: { // 동쪽
X_ax.push_back(y_b); // 주사위 윗면을 오른쪽 면으로
Y_ax.back() = X_ax.front(); // 주사위 왼쪽 면을 주사위 윗면으로
X_ax.pop_front(); // 복사된 왼쪽면 삭제
Y_ax[1] = X_ax[1]; // Y, X축 동기화
break;
}
case 2: { // 서쪽
X_ax.push_front(y_b);
Y_ax.back() = X_ax.back();
X_ax.pop_back();
Y_ax[1] = X_ax[1];
break;
}
case 3: { // 북쪽
Y_ax.pop_back();
Y_ax.push_front(y_b);
X_ax[1] = Y_ax[1];
break;
}
case 4: { // 남쪽
Y_ax.pop_front();
Y_ax.push_back(y_f);
X_ax[1] = Y_ax[1];
break;
}
}
}
int main() {
scanf("%d%d%d%d%d",&N,&M,&y,&x,&K);
short map[N][M], op;
for(int i=0;i<N;++i) // 지도 입력
for(int j=0;j<M;++j)
scanf("%hd",&map[i][j]);
for(int i=0;i<3;++i) { // deque(주사위) 초기화
X_ax.push_back(0);
Y_ax.push_back(0);
}
Y_ax.push_back(0);
for(int i=0;i<K;++i) {
scanf("%hd",&op);
int n_x = x+dx[op-1], n_y = y+dy[op-1];
if(!bound(n_x,n_y)) continue; // map 볌위를 넘어가면 패스
roll(op); // 주사위 굴리기
if(map[n_y][n_x] == 0) { // map이 0이면
map[n_y][n_x] = X_ax[1]; // 현재 주사위 바닥 map에 복사
} else {
X_ax[1] = map[n_y][n_x]; // map 바닥을 주사위에 복사
Y_ax[1] = X_ax[1];
map[n_y][n_x] = 0;
}
printf("%d\n",Y_ax.back()); // 주사위 윗면 출력
x = n_x, y = n_y;
}
}
문제 조건을 잘 읽지 않아(주사위 초기 위치 (row,col), 바닥을 주사위에 복사한 후 map[n_y][n_x] 0으로 대치) 뭐가 틀렸는지 찾는데 장장 한 시간을 소비했다..
'Algorithms > ACMICPC(백준)' 카테고리의 다른 글
BOJ 2213 트리의 독립집합 (0) | 2019.08.14 |
---|---|
BOJ 14502 연구소 (0) | 2019.08.06 |
BOJ 5568 카드 놓기 (0) | 2019.07.26 |
BOJ 2167 2차원 배열의 합 (0) | 2019.07.23 |
BOJ 1912 연속합 (0) | 2019.07.17 |
Comments