반응형
개인적인 풀이일 뿐, 최적의 정답이 아님을 알려드립니다.
문제
난이도: 골드 5
사용언어: JAVA
풀이
특별한 자료구조를 사용하는 것이 아닌 구현 문제입니다. 주사위가 굴러갈 때마다 주사위의 각 면을 새롭게 배치해주는 방식으로 해결하였습니다.
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
int[][] arr = new int[N][M];
int[][] d = {{0, 0}, {0, 1}, {0, -1}, {-1, 0}, {1, 0}}; // 주사위가 굴러갈 방향
int[] dice = {0, 0, 0, 0, 0, 0, 0}; // 주사위는 최초에 모든 면이 0이다.
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
} // 배열에 지도 입력
st = new StringTokenizer(br.readLine());
for (int i = 0; i < K; i++) {
int D = Integer.parseInt(st.nextToken());
int[] new_dice = {0, 0, 0, 0, 0, 0, 0}; // 새로운 주사위를 만들어서 각 방향으로 구르는 경우에 대한 새로운 배치를 저장
if (x + d[D][0] < 0 || x + d[D][0] >= N || y + d[D][1] < 0 || y + d[D][1] >= M) // 지도 밖으로 벗어난 경우
continue;
if (D == 1) {
new_dice = new int[]{0, dice[4], dice[2], dice[1], dice[6], dice[5], dice[3]};
} else if (D == 2) {
new_dice = new int[]{0, dice[3], dice[2], dice[6], dice[1], dice[5], dice[4]};
} else if (D == 3) {
new_dice = new int[]{0, dice[5], dice[1], dice[3], dice[4], dice[6], dice[2]};
} else if (D == 4) {
new_dice = new int[]{0, dice[2], dice[6], dice[3], dice[4], dice[1], dice[5]};
}
for (int j = 1; j < 7; j++) {
dice[j] = new_dice[j];
} // dice에 새롭게 만든 주사위를 옮겨줌
x = x + d[D][0];
y = y + d[D][1]; // 주사위를 이동
if (arr[x][y] == 0) { // 이동할 지점이 0인 경우
arr[x][y] = dice[6]; // 주사위의 밑 면의 숫자를 지도에 복사
} else {
dice[6] = arr[x][y]; // 그렇지 않으면 주사위의 밑면에 지도의 숫자를 복사하고
arr[x][y] = 0; // 지도의 해당지점은 0으로 초기화
}
bw.write(String.valueOf(dice[1]) + "\n");
}
bw.flush();
bw.close();
br.close();
}
}
|
cs |
반응형
'백준 온라인 저지 > Gold' 카테고리의 다른 글
[BOJ] 20057 - 마법사 상어와 토네이도 (0) | 2021.04.13 |
---|---|
[BOJ] 14891 - 톱니바퀴 (0) | 2021.04.11 |
[BOJ] 6593 - 상범 빌딩 (0) | 2021.03.23 |
[BOJ] 9935 - 문자열 폭발 (0) | 2021.03.22 |
[BOJ] 4179 - 불! (0) | 2021.03.17 |