최's 먹공로그
BOJ14499_주사위굴리기 본문
https://www.acmicpc.net/problem/14499
문제요약
map이 주어지고 명령어(1은 동쪽 , 2는 서쪽 , 3은 북쪽 , 4는 남쪽)와 명령어 횟수가 주어질 때
주사위가 움직일 때 마다 윗면을 출력하는 문제
1. 이동한 칸이 0이면 주사위의 바닥면에 쓰여 있는 수가 칸에 복사
2. 0이 아이면 칸에 쓰여 있는 수가 주사위 바닥면에 복사 , 칸은 0으로
3. map의 바깥으로 이동시 무시하고 다음 명령 실행 , 출력도 안함
문제 issue
1. 이동할때 마다 주사위의 면 상태가 변화한다 - swap으로 해결 남쪽을 예로 들면
남쪽으로 이동 : 1 -> 5 , 5 -> 6 , 6 -> 2 , 2-> 1
이런식의 이동이 다른 방향으로의 이동마다 고정적임
해결흐름
1. dice = {0,0,0,0,0,0,0} 로 초기화 해준다 1~6까지만 사용
2. 명령어 변수 order 한 개당 주사위의 위치를 다른 변수에 저장 해주고 이동 방향 따라서
동쪽은 ny++ , 서쪽은 ny-- , 북쪽은 nx-- , 남쪽은 nx++ 주사위의 위치를 이동해준다.
3. 위치가 이동했을 때 map 범위안이면 기존에 사용했던 주사위 위치 변수인 x , y에 x = nx , y = ny 해준뒤
swap 함수를 실행 해준다.
4. 칸이 0인지 아닌지 보고 조건에 따라서 다르게 수행해준다. 윗면을 list에 저장 해준다.
5. list를 출력 해준다.
소스코드
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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | package com.boj; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.StringTokenizer; public class Main14499_주사위굴리기 { private static int[] dice = {0,0,0,0,0,0,0}; private static int x; private static int y; private static int[][] map; private static ArrayList list; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine().trim(), " "); int N = Integer.parseInt(st.nextToken()); int M = Integer.parseInt(st.nextToken()); x = Integer.parseInt(st.nextToken()); y = Integer.parseInt(st.nextToken()); int K = Integer.parseInt(st.nextToken()); map = new int[N][M]; list = new ArrayList<Integer>(); for (int i = 0; i < N; i++) { st = new StringTokenizer(br.readLine().trim(), " "); for (int j = 0; j < M; j++) { int number = Integer.parseInt(st.nextToken()); map[i][j] = number; } } st = new StringTokenizer(br.readLine().trim(), " "); for (int i = 0; i < K; i++) { int order = Integer.parseInt(st.nextToken()); // order 한개 당 출력할 숫자를 리스트에 저장 if(order == 1) { // 동쪽으로 이동 // x,y값을 nx, ny에 복사 해주고 map안에 있는지 검사 int nx = x; int ny = y; ny++; if(ny < M) { solve(nx, ny, order); } } else if(order == 2) { // 서쪽으로 이동 // x,y값을 nx, ny에 복사 해주고 map안에 있는지 검사 int nx = x; int ny = y; ny--; if(ny >= 0) { solve(nx, ny, order); } } else if(order == 3) { // 북쪽으로 이동 // x,y값을 nx, ny에 복사 해주고 map안에 있는지 검사 int nx = x; int ny = y; nx--; if(nx >= 0) { solve(nx, ny, order); } } else if(order == 4) { // 남쪽으로 이동 // x,y값을 nx, ny에 복사 해주고 map안에 있는지 검사 int nx = x; int ny = y; nx++; if(nx < N) { solve(nx, ny, order); } } } for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } } // end of main private static void solve(int nx, int ny, int order) { x = nx; y = ny; // 주사위 swap swap(order); // 칸이 0인가? 아닌가? if(map[x][y] == 0) { // 주사위 바닥면을 칸에 복사 map[x][y] = dice[6]; list.add(dice[1]); } else if(map[x][y] != 0) { // 칸을 주사위 바닥면에 복사 , 칸은 0 dice[6] = map[x][y]; map[x][y] = 0; list.add(dice[1]); } } private static void swap(int order) { if(order == 1) { // 동쪽 // 동시에 바껴야 하기 때문에 int temp1 = dice[1]; int temp3 = dice[3]; int temp4 = dice[4]; int temp6 = dice[6]; dice[3] = temp1; dice[6] = temp3; dice[4] = temp6; dice[1] = temp4; } else if(order == 2) { // 서쪽 int temp1 = dice[1]; int temp3 = dice[3]; int temp4 = dice[4]; int temp6 = dice[6]; dice[4] = temp1; dice[6] = temp4; dice[3] = temp6; dice[1] = temp3; } else if(order == 3) { // 북쪽 int temp1 = dice[1]; int temp2 = dice[2]; int temp5 = dice[5]; int temp6 = dice[6]; dice[2] = temp1; dice[1] = temp5; dice[5] = temp6; dice[6] = temp2; } else if(order == 4) { // 남쪽 int temp1 = dice[1]; int temp2 = dice[2]; int temp5 = dice[5]; int temp6 = dice[6]; dice[5] = temp1; dice[6] = temp5; dice[2] = temp6; dice[1] = temp2; } } } // end of class | cs |
'APS' 카테고리의 다른 글
BOJ17281_야구 (0) | 2019.06.09 |
---|---|
BOJ14891_톱니바퀴 (2) | 2019.06.04 |
BOJ2980_도로와신호등 (0) | 2019.05.29 |
BOJ17143_낚시왕 (2) | 2019.05.09 |
BOJ17142_연구소3 (0) | 2019.05.07 |