728x90
https://www.acmicpc.net/problem/14499
🤔 문제 풀이
쉽지 않았던 시뮬레이션/구현 문제였다.
주사위를 굴렸을 때 map과 닿는 각 면의 숫자를 어떻게 채워줄지 막막했었다.
주사위가 다음과 같이 있다고 하고, 윗면을 보이는 주사위가 3이라고 한다면 다음과 같은 방식으로 움직이게 된다.
동쪽이동 | 서쪽이동 | 북쪽이동 | 남쪽이동 |
2 -> 3 | 4 -> 3 | 5 -> 3 | 1 -> 3 |
6 -> 2 | 6 -> 4 | 6 -> 5 | 6 -> 1 |
4 -> 6 | 2 -> 6 | 1 -> 6 | 5 -> 6 |
3 -> 4 | 3 -> 2 | 3 -> 1 | 3 -> 5 |
이 규칙을 이용하여 다음과 같은 로직으로 풀었다.
1. 다음 좌표가 map을 벗어나는지 검사하고
2. 벗어나지 않는다면 주사위 각 면의 숫자들을 다음 면으로 이동시킨 뒤
3. map[x][y] 좌표가 0이라면 주사위 면의 숫자를 map[x][y]로, 아니라면 map[x][y]를 주사위 아랫면인 d[6]으로 저장한다.
4. 주사위의 윗 면인 d[3]을 출력한다.
🚨CODE
import java.util.*;
import java.io.*;
import java.math.BigInteger;
public class Main {
static int[][] map;
static int[] d;
static int[] dx = {0,0,0,-1,1}; // 1=동, 2=서, 3=북, 4=남
static int[] dy = {0,1,-1,0,0};
static int x,y,n,m;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
map = new int[n][m];
d = new int[7];
x = Integer.parseInt(st.nextToken());
y = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
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());
for(int i = 0; i<k; i++) {
int direct = Integer.parseInt(st.nextToken());
move(direct);
}
System.out.println(sb);
}
public static void move(int direct) {
int nextX = x+dx[direct];
int nextY = y+dy[direct];
if(nextX < 0 || nextY < 0 || nextX >= n || nextY >= m)
return;
changeTop(direct, nextX, nextY);
x = nextX; y = nextY;
}
public static void changeTop(int direct, int x, int y) {
int temp = d[3]; // 주사위 윗면
// 이동 방향이 동쪽이라면
if(direct == 1) {
d[3] = d[2];
d[2] = d[6];
d[6] = d[4];
d[4] = temp;
} // 서쪽이라면
else if(direct == 2) {
d[3] = d[4];
d[4] = d[6];
d[6] = d[2];
d[2] = temp;
} // 북쪽이라면
else if(direct == 3) {
d[3] = d[5];
d[5] = d[6];
d[6] = d[1];
d[1] = temp;
} // 남쪽이라면
else if(direct == 4) {
d[3] = d[1];
d[1] = d[6];
d[6] = d[5];
d[5] = temp;
}
if(map[x][y] == 0)
map[x][y] = d[6];
else {
d[6] = map[x][y];
map[x][y] = 0;
}
sb.append(d[3]).append("\n");
}
}
728x90
반응형
'코딩테스트' 카테고리의 다른 글
[Gold5-JAVA] 백준 21278 - 호석이 두 마리 치킨 (0) | 2024.04.01 |
---|---|
[Silver2-JAVA] 백준 1780 - 종이의 개수 (0) | 2024.04.01 |
[Gold4-JAVA] 백준 15918 - 랭퍼든 수열쟁이야!! (0) | 2024.03.30 |
[Silver1-JAVA] 백준 14888 - 연산자 끼워넣기 (0) | 2024.03.26 |
[Silver3-JAVA] 백준 2407 - 조합 (0) | 2024.03.26 |