728x90
14499 - 주사위 굴리기
https://www.acmicpc.net/problem/14499

문제
크기 NxM인 지도/ 오른쪽은 동쪽, 위쪽은 북쪽
지도의 좌표 (r, c) -> r: 북쪽으로부터 떨어진 칸의 개수, c: 서쪽으로부터 떨어진 칸의 개수
주사위는 지도 위에 윗 면이 1, 동쪽을 바라보는 방향이 3인 상태/ 놓여져 있는 곳 좌표 (x, y)/ 가장 처음에는 모든 면 0
지도 각 칸에 정수 하나씩 쓰여 있음
주사위 굴렸을 때, 이동한 칸에 쓰여 있는 수 0 -> 주사위 바닥면에 쓰여 있는 수가 칸에 복사
/ 0이 아닌 경우 -> 칸에 쓰여 있는 수 -> 주사위 바닥면으로 복사, 칸에 쓰여 있는 수 0이 됨
입력
첫째 줄: 지도 세로 크기 N, 가로 크기 M (1 <= N, M <= 20)
, 주사위 놓은 곳 좌표 x, y (0 <= x < N-1, 0 <= y <= M-1), 명령의 개수 K (1 <= K <= 1,000)
둘째 줄 ~ N개 줄: 지도에 쓰여 있는 수: 북 -> 남/ 각 줄: 서 -> 동
(주사위 놓은 칸에 쓰여 있는 수 항상 0, 지도 각 칸에 쓰여 있는 수 < 10 or 0)
출력: 이동할 때마다 주사위 윗 면에 쓰여 있는 수
IF. 바깥으로 이동시키려고 하는 경우 -> 해당 명령 무시, 출력 X
풀이
- `map[x][y] == 0` -> 주사위 바닥면(`dice[1]`) 값을 `map[x][y]`로 복사
- `map[x][y] != 0` -> 맵의 숫자를 주사위 바닥면에 복사, 맵은 0이 됨
항상 윗면(`dice[0]`) 출력
x = nx;
y = ny;
if (map[x][y] == 0) {
map[x][y] = dice[1];
} else {
dice[1] = map[x][y];
map[x][y] = 0;
}
주사위 인덱스
[2] // 앞
[4] [0] [5] // 왼, 위, 오른
[3] // 뒤
[1] // 바닥
1 : 동 / 2 : 서 / 3 : 남 / 4 : 북
- 동: 오른쪽 면이 바닥에 떨어짐 / 윗면은 오른쪽으로 넘어가 오른쪽 면이 됨
/ 왼쪽 면은 윗면이 됨 / 바닥면은 왼쪽 면으로 올라옴
=> Top -> Right -> Bottom -> Left -> Top = 반대 방향(Left -> Top) 순으로 값이 채워짐
- top <- left
- left <- bottom
- bottom <- right
- right <- top
static int[] dice = new int[6];
static void roll(int dir) {
int temp;
switch (dir) {
case 1:
temp = dice[0];
dice[0] = dice[4];
dice[4] = dice[1];
dice[1] = dice[5];
dice[5] = temp;
break;
case 2:
temp = dice[0];
dice[0] = dice[5];
dice[5] = dice[1];
dice[1] = dice[4];
dice[4] = temp;
break;
case 3:
temp = dice[0];
dice[0] = dice[2];
dice[2] = dice[1];
dice[1] = dice[3];
dice[3] = temp;
break;
case 4:
temp = dice[0];
dice[0] = dice[3];
dice[3] = dice[1];
dice[1] = dice[2];
dice[2] = temp;
break;
}
}
코드
import java.io.*;
import java.util.*;
// 주사위 굴리기
public class boj_14499 {
static int N, M, x, y, K;
static int[][] map;
static int[] dice = new int[6];
static int[] dx = {0, 0, -1, 1};
static int[] dy = {1, -1, 0, 0};
static void roll(int dir) {
int temp;
switch (dir) {
case 1:
temp = dice[0];
dice[0] = dice[4];
dice[4] = dice[1];
dice[1] = dice[5];
dice[5] = temp;
break;
case 2:
temp = dice[0];
dice[0] = dice[5];
dice[5] = dice[1];
dice[1] = dice[4];
dice[4] = temp;
break;
case 3:
temp = dice[0];
dice[0] = dice[2];
dice[2] = dice[1];
dice[1] = dice[3];
dice[3] = temp;
break;
case 4:
temp = dice[0];
dice[0] = dice[3];
dice[3] = dice[1];
dice[1] = dice[2];
dice[2] = temp;
break;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
x = Integer.parseInt(st.nextToken());
y = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
map = new int[N][M];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
st = new StringTokenizer(br.readLine());
while (K-- > 0) {
int command = Integer.parseInt(st.nextToken());
int nx = x + dx[command - 1];
int ny = y + dy[command - 1];
if (nx < 0 || ny < 0 || nx >= N || ny >= M) continue;
roll(command);
x = nx;
y = ny;
if (map[x][y] == 0) {
map[x][y] = dice[1];
} else {
dice[1] = map[x][y];
map[x][y] = 0;
}
sb.append(dice[0]).append("\n");
}
System.out.println(sb);
}
}728x90
반응형
'✏️ > BOJ' 카테고리의 다른 글
| [BOJ/Simulation] 백준 14891 - 톱니바퀴 (Java) (0) | 2025.12.05 |
|---|---|
| [BOJ/Graph] 백준 1043 - 거짓말 (Java) (0) | 2025.12.04 |
| [BOJ/Graph] 백준 5214 - 환승 (Java) (0) | 2025.12.04 |
| [BOJ/PriorityQueue] 백준 1781 - 컵라면 (Java) (0) | 2025.12.01 |
| [BOJ/Floyd-Warshall] 백준 1507 - 궁금한 민호 (Java) (0) | 2025.11.28 |