728x90
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개의 줄에 지
www.acmicpc.net
처음엔 주사위의 상하좌우 전후 방향을 가리키는 포인터를 가지고 하려고 했는데, 생각보다 잘 안돼서 설마 시간이 얼마 걸리나 봤더니
2초였다...!! 시간낭비를 해버린..^^ 그냥 주사위를 열심히 굴려줬다.
📌 진행 순서
1. 해당 방향으로 주사위가 이동 가능한지 체크
2. 주사위 굴리기
3. 굴러간 위치의 값 확인하기
3-1. 0이면 주사위 바닥면의 값을 지도위치에 넣어준다.
3-2. 0이 아니면 지도위치의 값을 주사위 바닥면에 넣고, 해당 위치의 지도 값을 0으로 변경한다.
4. 주사위 상단면 값 출력
주사위의 값을 dice[4][3] 2차원 배열에 넣어주고,
상: (1, 1)
하: (3, 1)
좌: (1, 0)
우: (1, 2)
전: (2, 1)
후: (0, 1)
좌표값으로 이용했다.
북/남으로 굴리면 행만 변한다. for문을 이용해서 이동시켰다.
if(com == 3){ //북
int tmp = dice[0][1];
for(int i=0; i<3; i++) dice[i][1] = dice[i+1][1];
dice[3][1] = tmp;
}else if(com == 4){ //남
int tmp = dice[3][1];
for(int i=3; i>0; i--) dice[i][1] = dice[i-1][1];
dice[0][1] = tmp;
}
동/서는 조금 복잡한데 이 규칙찾느라 조금 시간이 걸렸다. 잘 몰라서 그냥 다 적어봤음ㅎㅎ
if(com == 1){ //동
int tmp = dice[1][2];
dice[1][2] = dice[1][1];
dice[1][1] = dice[1][0];
dice[1][0] = dice[3][1];
dice[3][1] = tmp;
}else if(com == 2){ //서
int tmp2 = dice[1][0];
dice[1][0] = dice[1][1];
dice[1][1] = dice[1][2];
dice[1][2] = dice[3][1];
dice[3][1] = tmp2;
}
전체 코드
#include <iostream>
#include <algorithm>
using namespace std;
int n, m, x, y, k;
int arr[21][21];
int dir[5][2] = {{0, 0}, {0, 1}, {0, -1}, {-1, 0}, {1, 0}}; //동:1, 서:2, 북:3, 남:4
int dice[4][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}};
int main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> m >> x >> y >> k;
for(int i=0; i<n; i++) for(int j=0; j<m; j++) cin >> arr[i][j];
while(k--){
int com;
cin >> com;
//해당 방향으로 이동가능한지 체크
int dx = x + dir[com][0];
int dy = y + dir[com][1];
if(0 > dx || dx >= n || 0 > dy || dy >= m) continue; //바깥으로 이동하는 경우는 패스
//주사위 굴리기 -> 상/하단 좌표 변경해주기
if(com == 1){ //동
int tmp = dice[1][2];
dice[1][2] = dice[1][1];
dice[1][1] = dice[1][0];
dice[1][0] = dice[3][1];
dice[3][1] = tmp;
}else if(com == 2){ //서
int tmp2 = dice[1][0];
dice[1][0] = dice[1][1];
dice[1][1] = dice[1][2];
dice[1][2] = dice[3][1];
dice[3][1] = tmp2;
}else if(com == 3){ //북
int tmp = dice[0][1];
for(int i=0; i<3; i++) dice[i][1] = dice[i+1][1];
dice[3][1] = tmp;
}else if(com == 4){ //남
int tmp = dice[3][1];
for(int i=3; i>0; i--) dice[i][1] = dice[i-1][1];
dice[0][1] = tmp;
}
//해당 좌표의 값 확인하기
//0이면 주사위 바닥면의 값을 해당 좌표에 넣기
//0이 아니면 좌표의 값을 바닥면에 넣고, 좌표의 값은 0으로 변경
if(arr[dx][dy] == 0){
arr[dx][dy] = dice[3][1];
} else {
dice[3][1] = arr[dx][dy];
arr[dx][dy] = 0;
}
//주사위 상단top의 값 출력
cout << dice[1][1] << '\n';
x = dx; y = dy;
}
return 0;
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준/c++] 3190번: 뱀 (0) | 2022.11.23 |
---|---|
[백준/c++] 5427번: 불 (0) | 2022.11.17 |
[백준/c++] 14719번: 빗물 (0) | 2022.11.15 |
[백준/c++] 15686번: 치킨 배달 (0) | 2022.11.13 |
[백준/c++] 11559번: 뿌요뿌요 (0) | 2022.11.13 |