티스토리 뷰

https://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

import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

    public static class Dice {
        int x, y;
        int[][] dice_val;

        public Dice(int x, int y, int[][] dice_val) {
            this.x = x;
            this.y = y;
            this.dice_val = dice_val;
        }
    }

    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static int N, M, K;
    static int[][] map;
    static int[] arr;
    static int[] tmp = new int[4];
    static Dice dice;

    public static void rolling_north() {
        for(int i = 0; i < 4; i++) {
            tmp[i] = dice.dice_val[(i + 1) % 4][1];
        }
        for(int i = 0; i < 4; i++) {
            dice.dice_val[i][1] = tmp[i];
        }
    }
    public static void rolling_south() {
        for(int i = 0; i < 4; i++) {
            tmp[i] = dice.dice_val[(i + 3) % 4][1];
        }
        for(int i = 0; i < 4; i++) {
            dice.dice_val[i][1] = tmp[i];
        }
    }
    public static void rolling_east() {
        int save = dice.dice_val[1][2];
        for(int i = 0; i < 2; i++) {
            dice.dice_val[1][2 - i] = dice.dice_val[1][1 - i];
        }
        dice.dice_val[1][0] = dice.dice_val[3][1];
        dice.dice_val[3][1] = save;
    }
    public static void rolling_west() {
        int save = dice.dice_val[1][0];
        for(int i = 0; i < 2; i++) {
            dice.dice_val[1][i] = dice.dice_val[1][i + 1];
        }
        dice.dice_val[1][2] = dice.dice_val[3][1];
        dice.dice_val[3][1] = save;
    }

    public static void print() {
        for(int j = 0; j < 4; j++) {
            System.out.println(Arrays.toString(dice.dice_val[j]));
        }
        System.out.println("----");
    }

    public static void func() throws IOException {
        for(int k = 0; k < K; k++) {
            int nx = dice.x, ny = dice.y;
            int dir = arr[k];
            switch (dir) {
                case 1: // 동
                    nx += 1;
                    if(nx >= M) {
                        continue;
                    }
                    rolling_east();
                    break;
                case 2: // 서
                    nx -= 1;
                    if(nx < 0) {
                        continue;
                    }
                    rolling_west();
                    break;
                case 3: // 북
                    ny -= 1;
                    if(ny < 0) {
                        continue;
                    }
                    rolling_north();
                    break;
                default: // 남
                    ny += 1;
                    if(ny >= N) {
                        continue;
                    }
                    rolling_south();
                    break;
            }
            dice.x = nx;
            dice.y = ny;
            if(map[ny][nx] == 0) { // 주사위 바닥에 쓰인 값이 바닥에 복사된다
                map[ny][nx] = dice.dice_val[3][1];
            } else { // 바닥에 쓰인 값이 주사위 바닥에 복사된다 + 바닥은 0이된다
                dice.dice_val[3][1] = map[ny][nx];
                map[ny][nx] = 0;
            }
            bw.write(dice.dice_val[1][1] + "\n"); // 주사위 윗면 출력.
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stk = new StringTokenizer(br.readLine());
        N = Integer.parseInt(stk.nextToken());
        M = Integer.parseInt(stk.nextToken());
        map = new int[N][M];
        int y = Integer.parseInt(stk.nextToken());
        int x = Integer.parseInt(stk.nextToken());
        dice = new Dice(x, y, new int[4][3]); // 주시위 객체 생성
        K = Integer.parseInt(stk.nextToken());
        arr = new int[K];

        for(int j = 0; j < N; j++) { // 지도 그리기
            stk = new StringTokenizer(br.readLine());
            for(int i = 0; i < M; i++) {
                map[j][i] = Integer.parseInt(stk.nextToken());
            }
        }

        stk = new StringTokenizer(br.readLine()); // 이동방향 입력
        for(int k = 0; k < K; k++) {
            arr[k] = Integer.parseInt(stk.nextToken());
        }

        func();

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

 

주사위 구현만 잘 하면 크게 어렵지는 않았던 것 같다.

 

주사위 구현은 문제 중에 평면도? 전개도 그 모형이 있길래 그걸 활용해서

주사위 객체를 하나 만들고, 4x3 배열을 이용하여 전개도의 상태를 담고있기로 했다.

 

 

주사위 굴리는것만 구현하면 되는데 이건 그려보다보면 대충 공식이 보인다.

북쪽/남쪽으로 굴릴때는 1열 라인에 있는 원소만 한칸씩 앞으로 땡기거나 밀거나 하는 방식으로 움직이는 등..

 

동, 서, 남, 북 각각 메소드를 구현하고 시키는대로만 따라하면 풀렸던 문제

 

이렇게 말하니 쉬워보이는데 또 막상 푸는 시간은 오래걸렸던 것 같다. 연습을 많이 해봐야지..

 

 

 

'알고리즘 > 구현, 브루트포스' 카테고리의 다른 글

프로그래머스 | 자물쇠와 열쇠 - java  (0) 2022.08.28
[JAVA] # 3190 뱀  (0) 2021.09.13
[JAVA] # 14503 로봇청소기  (0) 2021.09.12
[JAVA] #14500 테트로미노  (0) 2021.08.23
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함