[백준](Java) 14499 - 주사위 굴리기

민지킴·2021년 6월 28일
0

백준

목록 보기
35/48
post-thumbnail

문제 링크

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

문제 풀이

문제를 읽다가 머리가 터지는줄 알았다. 주사위의 이동을 값들을 교체해 주는 방법으로 접근했다. 특히 x,y값의 범위설정이 조금 특이하게 되있었다. x값인데 범위가 세로값이었네..! 오우... 문제를 더 꼼꼼히 읽자...

문제를 해석하는데가 오래걸리고 구현은 금방 걸렸다.
모두 같은 로직을 사용했으므로 그중에 한가지만 놓고면
남쪽으로 이동하는 경우

주사위를 위,아래,정면,뒤,우측, 좌측으로 놓고

우측, 좌측면의 숫자는 그대로이다.
정면 -> 아래, 아래 -> 뒤 , 뒤->위, 위-> 정면 으로 면 이동이 이루어진다.
이를 temp값들을 이용하여 교체해주었다.

이 과정에서 down(바닥면)의 값이 바뀌게 될때
valChange라는 메서드를 통해서 지도타일의 값을 판단하여 지도타일의 값을 복사하게 된다.

    public static void valChange(){
        //지도의 값이 0이 아니면 down(바닥면)에 값을 복사하고, 지도의 값은 0으로
        //지도의 값이 0이면 down(바닥면)에 있는 값을 지도에 복사한다.  
        if(map[startx][starty]!=0){
            down = map[startx][starty];
            map[startx][starty]=0;
        }else{
            map[startx][starty] = down;
        }
    }

switch 문에 들어가기전에 현재 위치에서 이동할수 있는지 판단하고 이동한다.

        if(!(y + diry[pos - 1]>=0 && y + diry[pos - 1]<n && x + dirx[pos - 1]>=0 && x + dirx[pos - 1]<m)){
            return;
        }

모든 과정에서 up(위면)의 값은 StringBuilder에 저장되고, 반복문 종료시에 출력한다.


코드


import java.util.*;

public class Main {

    static int n;
    static int m;
    static int[][] map;
    static int starty;
    static int startx;
    static StringBuilder sb = new StringBuilder();
    /**
     *   2
     * 4 1 3
     *   5
     *   6
     */

    static int up = 0; // 위 (1)
    static int down = 0; // 아래 (6)
    static int forward = 0; //정면 (5)
    static int back = 0; //뒤 (2)
    static int right = 0; //우측 (3)
    static int left = 0; //좌측 (4)
    
    //동 서 북 남
    static int[] diry = {0, 0, -1, 1};
    static int[] dirx = {1, -1, 0, 0};

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        n = sc.nextInt();
        m = sc.nextInt();
        startx = sc.nextInt(); //세로
        starty = sc.nextInt(); //가로
        int num = sc.nextInt();
        map = new int[n][m];


        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                map[i][j] = sc.nextInt();
            }
        }

        for (int i = 0; i < num; i++) {
            roll(startx, starty, sc.nextInt());
        }
        System.out.print(sb);
    }

    public static void roll(int y, int x, int pos) {
        //pos 동 서 북 남
        if(!(y + diry[pos - 1]>=0 && y + diry[pos - 1]<n && x + dirx[pos - 1]>=0 && x + dirx[pos - 1]<m)){
            return;
        }
        //이동
        startx = y + diry[pos - 1];
        starty = x + dirx[pos - 1];

        int temp = 0;
        int temp2 =0;
        int temp3 =0;

        switch (pos) {
            //동 -> 우측
            case 1:
                //right -> down
                temp = down;
                down = right;
                valChange();
                //down -> left
                temp2 = left;
                left = temp;//down

                //left -> up
                temp3 = up;
                up = temp2; //left

                //up -> right
                right = temp3;//up
                //forward -> forward
                //back -> back
                break;
            //서
            case 2:
                //forward -> forward
                //back -> back
                //left -> down
                temp = down;
                down = left;
                valChange();
                //down -> right
                temp2 = right;
                right = temp;
                //right -> up
                temp3 = up;
                up = temp2;
                //up -> left
                left = temp3;
                break;
            //북
            case 3:
                //left -> left
                //right -> right;

                //back -> down
                temp = down;
                down = back;
                valChange();
                //down -> forward
                temp2 = forward;
                forward = temp;
                //forward -> up
                temp3 = up;
                up = temp2;
                //up -> back
                back = temp3;
                break;
            //남
            case 4:
                //left -> left
                //right -> right;
                //forward -> down
                temp = down;
                down = forward;
                valChange();
                //down -> back
                temp2 = back;
                back = temp;

                //back -> up
                temp3 = up;
                up = temp2;

                //up -> forward
                forward = temp3;
                break;
        }
        sb.append(up+"\n");
    }

    public static void valChange(){
        //지도의 값이 0이 아니면 down(바닥면)에 값을 복사하고, 지도의 값은 0으로
        //지도의 값이 0이면 down(바닥면)에 있는 값을 지도에 복사한다.  
        if(map[startx][starty]!=0){
            down = map[startx][starty];
            map[startx][starty]=0;
        }else{
            map[startx][starty] = down;
        }
    }
}

profile
하루하루는 성실하게 인생 전체는 되는대로

0개의 댓글