백준 온라인 저지/Gold

[BOJ] 14499 - 주사위 굴리기

jooona 2021. 4. 5. 19:43
반응형

개인적인 풀이일 뿐, 최적의 정답이 아님을 알려드립니다.

 

문제

www.acmicpc.net/problem/14499

 

14499번: 주사위 굴리기

첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지도

www.acmicpc.net

난이도: 골드 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 = {{00}, {01}, {0-1}, {-10}, {10}}; // 주사위가 굴러갈 방향
        int[] dice = {0000000}; // 주사위는 최초에 모든 면이 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 = {0000000}; // 새로운 주사위를 만들어서 각 방향으로 구르는 경우에 대한 새로운 배치를 저장
            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