Algorithm & Data Structure/문제풀이

[Algorithm] 백준온라인저지 14499번(BOJ-14499) 주사위 굴리기 Java로 문제풀이(구현)

coding-knowjam(코딩노잼) 2021. 7. 20.
728x90

안녕하세요 Coding-Knowjam입니다.

오늘은 백준 온라인 저지에 있는 14499번 주사위 굴리기 문제를 풀어보겠습니다.

 

1. 문제 설명

문제를 설명하기에 앞서 아래 링크를 통해 문제를 읽고 와주시길 바랍니다.

https://www.acmicpc.net/problem/14499

 

이번 문제의 난이도는 골드 5로 크게 어렵지 않은 문제입니다.

문제풀이를 위해 특별한 알고리즘이 필요하지는 않고, 주어진 내용대로 구현만 하면 됩니다.

주사위가 굴러가면서 각각의 면에 위치하는 값들이 바뀌게 되는데, 이 부분만 주의해서 구현하면 다 푼 거나 다름없습니다.

그럼 코드를 살펴보겠습니다.

 

2. 문제 풀이 (Java)

package study.blog.codingnojam.algorithm;

import java.io.*;

public class BOJ_14499 {

    // 백준온라인저지 14499번 주사위 굴리기 Java로 문제 풀이
    public static void main(String[] args) throws IOException {

        // 입력정보 받기
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String[] info = br.readLine().split(" ");
        int N = Integer.parseInt(info[0]);      // 지도 세로 사이즈
        int M = Integer.parseInt(info[1]);      // 지도 가로 사이즈
        int R = Integer.parseInt(info[2]);      // 지도에 위치한 주사위 좌표(세로)
        int C = Integer.parseInt(info[3]);      // 지도에 위치한 주사위 좌표(가로)
        int K = Integer.parseInt(info[4]);      // 주사위 굴리는 명령 개수

        // 주사위 생성후 좌표 초기화
        Dice dice = new Dice();
        dice.row = R;
        dice.column = C;

        // 지도 생성 후 주어진 정보에 따라 초기화
        int[][] map = new int[N][M];
        for (int i = 0; i < N; i++) {
            String[] temp = br.readLine().split(" ");
            for (int j = 0; j < M; j++) {
                map[i][j] = Integer.parseInt(temp[j]);
            }
        }

        // 주사위 굴리는 순서 받기
        String[] command = br.readLine().split(" ");

        // 주사위 좌표 이동할 때 사용할 배열
        int[] moveRow = {0, 0, -1, 1};
        int[] moveColumn = {1, -1, 0, 0};

        // 명령 개수만큼 반복문 실행
        for (int i = 0; i < K; i++) {
            // 동서남북 중 이동해야할 좌표 계산
            int direct = Integer.parseInt(command[i]);
            int mr = dice.row + moveRow[direct-1];
            int mc = dice.column + moveColumn[direct-1];

            // 계산 된 좌표가 지도를 벗어나면 명령 무시
            if (mr < 0 || mr >= N || mc < 0 || mc >= M) {
                continue;
            } else {
                // 계산 된 좌표로 주사위 이동
                dice.row = mr;
                dice.column = mc;
                int temp = 0;
                switch (direct) {
                    case 1 :    // 동쪽으로 이동
                        // 주사위가 구르면 각각의 면들의 값이 바뀌므로 값 갱신
                        temp = dice.top;
                        dice.top = dice.left;
                        dice.left = dice.bottom;
                        dice.bottom = dice.right;
                        dice.right = temp;
                        // 이동한 좌표값이 0이면 주사위 바닥의 값을 복사
                        if (map[mr][mc] == 0) {
                            map[mr][mc] = dice.bottom;
                        } else {
                            // 이동한 좌표값이 1이상이면 좌표값을 주사위 바닥면에 복사
                            dice.bottom = map[mr][mc];
                            // 복사 후 해당 좌표에 저장 된 값은 0으로 바뀜
                            map[mr][mc] = 0;
                        }
                        break;
                    case 2 : // 서쪽으로 이동
                        // case 1과 갱신되는 값들의 차이만 있고 나머지 로직 모두 동일
                        temp = dice.top;
                        dice.top = dice.right;
                        dice.right = dice.bottom;
                        dice.bottom = dice.left;
                        dice.left = temp;
                        if (map[mr][mc] == 0) {
                            map[mr][mc] = dice.bottom;
                        } else {
                            dice.bottom = map[mr][mc];
                            map[mr][mc] = 0;
                        }
                        break;
                    case 3 : // 북쪽으로 이동
                        // case 1과 갱신되는 값들의 차이만 있고 나머지 로직 모두 동일
                        temp = dice.top;
                        dice.top = dice.back;
                        dice.back = dice.bottom;
                        dice.bottom = dice.front;
                        dice.front = temp;
                        if (map[mr][mc] == 0) {
                            map[mr][mc] = dice.bottom;
                        } else {
                            dice.bottom = map[mr][mc];
                            map[mr][mc] = 0;
                        }
                        break;
                    case 4 : // 남쪽으로 이동
                        // case 1과 갱신되는 값들의 차이만 있고 나머지 로직 모두 동일
                        temp = dice.top;
                        dice.top = dice.front;
                        dice.front = dice.bottom;
                        dice.bottom = dice.back;
                        dice.back = temp;
                        if (map[mr][mc] == 0) {
                            map[mr][mc] = dice.bottom;
                        } else {
                            dice.bottom = map[mr][mc];
                            map[mr][mc] = 0;
                        }
                        break;
                }
                // 주사위의 이동이 종료되면 윗면의 값을 출력
                bw.write(String.valueOf(dice.top));
                bw.newLine();
            }
        }

        bw.flush();
        bw.close();
    }

    // 주사위 클래스
    static class Dice {
        // 윗면, 아랫면, 왼쪽면, 오른쪽면, 앞면, 뒷면 변수
        int top, bottom, left, right, front, back;
        // 주사위가 위치한 좌표 (세로, 가로)
        int row, column;
    }
}

 

코드에 대한 설명은 라인별로 주석을 달아놓았습니다.

천천히 읽어보시고 이해가 안 되시거나 궁금하신 부분은 댓글을 남겨주시길 바랍니다.

감사합니다.


728x90

댓글