문제 링크
https://www.acmicpc.net/problem/14499
풀이
방향에 따라 움직일 때 마다 주사위의 값을 변경해준다.
주사위가 회전할 때마다 아래와 같이 모양이 변한다
| 기본 | 동쪽 | 서쪽 | 북쪽 | 남쪽 |
| 2 4 1 3 5 6 |
2 6 4 1 5 3 |
2 1 3 6 5 4 |
1 4 5 3 6 2 |
6 4 2 3 1 5 |
따라서 방향이 전환되면 그 방향에 따라 주사위의 위치에 따른 값을 전부 변경해준다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N, M, map[][], ju[];
static int[][] dir = {{0, 1}, {0, -1}, {-1, 0}, {1, 0}}; //동서북남
static StringBuilder sb;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer tokens = new StringTokenizer(br.readLine());
N = Integer.parseInt(tokens.nextToken());
M = Integer.parseInt(tokens.nextToken());
map = new int[N][M];
int x = Integer.parseInt(tokens.nextToken());
int y = Integer.parseInt(tokens.nextToken());
int K = Integer.parseInt(tokens.nextToken());
for (int i = 0; i < N; i++) {
tokens = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
map[i][j] = Integer.parseInt(tokens.nextToken());
}
}
//주사위 설정
ju = new int[7];
tokens = new StringTokenizer(br.readLine());
sb = new StringBuilder();
for (int i = 0; i < K; i++) {
int[] now = roll(x, y, Integer.parseInt(tokens.nextToken()) - 1, sb);
if(now == null) continue;
x = now[0];
y = now[1];
}
System.out.print(sb);
}//end main
private static int[] roll(int x, int y, int d, StringBuilder sb) {
//방향대로 다음 위치 확인
x += dir[d][0];
y += dir[d][1];
if (!isRange(x, y)) return null;
changeJu(d);
if(map[x][y] == 0){
map[x][y] = ju[6];
}else{
ju[6] = map[x][y];
map[x][y] = 0;
}
sb.append(ju[1]).append("\n"); //가장 윗면의 값 출력
return new int[]{x, y};
}
private static boolean isRange(int x, int y) {
if (x < 0 || y < 0 || x >= N || y >= M) return false;
return true;
}
private static void changeJu(int d) {
//굴리는 방향에 따라서 위치를 변경해줌. 1은 가장 윗면, 6은 가장 밑면이 됨
//기본 1 2 3 4 5 6
//오른 4 2 1 6 5 3
//왼쪽 3 2 6 1 5 4
//위쪽 5 1 3 4 6 2
//남쪽 2 6 3 4 1 5
int[] t = ju.clone();
if (d == 0) { //동
ju[1] = t[4];
ju[3] = t[1];
ju[4] = t[6];
ju[6] = t[3];
} else if (d == 1) { //서
ju[1] = t[3];
ju[3] = t[6];
ju[4] = t[1];
ju[6] = t[4];
} else if (d == 2) { //북
ju[1] = t[5];
ju[2] = t[1];
ju[5] = t[6];
ju[6] = t[2];
} else { //남
ju[1] = t[2];
ju[2] = t[6];
ju[5] = t[1];
ju[6] = t[5];
}
}
}'Problem Solving > BOJ' 카테고리의 다른 글
| [백준 Java] 1036 36진수 (0) | 2023.07.20 |
|---|---|
| [백준 Java] 3190 뱀 (0) | 2023.06.27 |
| [백준 Java] 14940 쉬운 최단거리 (0) | 2023.06.23 |
| [백준 Java] 9461 파도반 수열 (0) | 2023.06.23 |
| [백준 Java] 11724 연결 요소의 개수 (0) | 2023.06.23 |