반응형
https://www.acmicpc.net/problem/14499
[ 문제풀이 ]
단순한 시뮬레이션 문제이다. 각 방향으로 주사위를 굴리는 부분만 구현하면 쉽게 해결할 수 있는 문제이다.
나는 주사위를 굴렸을 때 6번 면이 항상 아래 면으로 오도록 구현하였다.
- 동쪽으로 주사위를 굴리는 경우 : (3, 6), (1, 3), (4, 1)을 swap 해주면 된다.
- 서쪽으로 주사위를 굴리는 경우 : (6, 4), (4, 1), (1, 3)을 swap 해주면 된다.
- 북쪽으로 주사위를 굴리는 경우 : (2, 6), (1, 2), (5, 1)을 swap 해주면 된다.
- 남쪽으로 주사위를 굴리는 경우 : (5, 6), (1, 5), (2, 1)을 swap 해주면 된다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
static StringTokenizer st;
static int N, M, K, diceY, diceX;
static int[] dice;
static int[][] map;
static int[][] dir = {{0,1}, {0,-1}, {-1,0}, {1,0}};
public static void main(String[] args) throws IOException {
dice = new int[7];
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
diceY = Integer.parseInt(st.nextToken());
diceX = 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());
for (int i = 0; i < K; ++i) {
int cmd = Integer.parseInt(st.nextToken()) - 1;
if (simulation(cmd)) {
bw.write(dice[1] + "\n");
}
}
bw.flush();bw.close();br.close();
}
public static boolean simulation(int cmd) {
int ny = diceY + dir[cmd][0];
int nx = diceX + dir[cmd][1];
//범위를 벗어나면 종료
if (ny < 0 || nx < 0 || ny >= N || nx >= M) return false;
diceY = ny; diceX = nx;
if (cmd == 0) {
swap(3, 6); swap(1, 3); swap(4, 1);
} else if (cmd == 1) {
swap(6, 4); swap(4, 1); swap(1, 3);
} else if (cmd == 2) {
swap(2, 6); swap(1, 2); swap(5, 1);
} else if (cmd == 3){
swap(5, 6); swap(1, 5); swap(2, 1);
}
//주사위 6번 면을 복사
copy_Bottom();
return true;
}
public static void copy_Bottom() {
if (map[diceY][diceX] == 0) {
map[diceY][diceX] = dice[6];
} else {
dice[6] = map[diceY][diceX];
map[diceY][diceX] = 0;
}
}
public static void swap(int a, int b) {
int temp = dice[a];
dice[a] = dice[b];
dice[b] = temp;
}
}
반응형
'Problem Solving > 삼성 SW 역량 테스트 기출' 카테고리의 다른 글
백준 14501 : 퇴사 (0) | 2021.08.01 |
---|---|
백준 14500 : 테트로미노 (0) | 2021.08.01 |
백준 13458 : 시험 감독 (0) | 2021.08.01 |
백준 3190 : 뱀 (0) | 2021.08.01 |
백준 12100 : 2048(Easy) (0) | 2021.08.01 |
댓글