티스토리 뷰
생각
Github - https://github.com/hellojdh/Code/blob/master/src/baekjoon/swtest/Q14499.java 크기가 N x M인 지도에 숫자들이 적혀있다. 주사위의 초기자리에는 0이 적혀있으며, 해당 지도의 숫자가 0이 아닐경우 지도의 숫자가 주사위로 복사되고, 해당 지도의 숫자가 0이면 주사위의 숫자가 해당 지도의 자리에 복사된다.(주사위의 아랫면) 주사위 하나를 굴릴 때마다 윗면의 번호를 출력하여라. 굴리다 지도 범위를 벗어나는 경우는 굴리지 않는다. 즉, 출력도 하지 않는다.
처음 생각
딱봤을 때, 어떻게 해야할 까 생각이 든다면, 이미 중수나 고수가 아닐까 생각한다. 문제는 이해가 간다. 주사위는 3D로 만들어진 육면체이다. 어떻게 코드로 구현을 할 까?
▶ 문제는 항상 많은 것을 주고있다. 이러한 고민에 대해서도 문제는 답을 제시해주고있다. 아래와 같은 조건이 문제 도입부에 주어진다.
▶ 그렇다!!! 이렇게 주사위 조건을 가지고 굴려나가면 된다.
다음 생각
주사위 배열로 [4][3] 배열을 만든 뒤, 자신만의 위치를 확고히 정해두면 된다. 문제를 풀이할 때는 아래와 같이 가정하였다. 나머지 공간은 사용하지 않았다.
▶ 배열을 선언한 뒤, 우선적으로 주사위를 굴리는 메소드를 구현해주었다.
▶ 예를들어 남쪽(아래)으로 굴리는 모션을 취한다면 좌면과 우면은 그대로고 가운대 열이 위로 한 칸씩 밀리면 된다. 북쪽(위)으로 굴리는 모션의 경우도 좌면과 우면은 그대로고 열이 아래로 한 칸씩 밀리면 될 것이다.
▶ 살짝 복잡한건 동쪽(우)과 서쪽(좌)로 굴릴 경우인데 이경우도 다 따져준후 바꿔주면 된다. 동쪽(우)으로 굴리는 경우만 살펴보자. 아래와 같은 방향으로 좌표들을 바꿔주면 된다. 서쪽(좌)으로 굴릴 경우는 반대가 될 것이다.
다다음 생각
주사위를 굴리는 구현을 다했다면 최초 좌표 (x,y)에서 명령의 방향대로 굴리면서 한 칸씩 전진 시켜주면 된다.
▶ 이 때, 도착하는 곳의 값이 0일 경우와 0이 아닌경우를 처리해주어야한다. 0일경우는 현 주사위의 (1,1)의 값을 복사해가고, 0이 아닌 경우는 해당 값을 주사위에 넣어준 후 0으로 바꿔준다.
▶ 주사위를 굴릴 때 (x,y)좌표 하나만 계속 변경하면 되기 때문에 x,y 값을 곧바로 바꿔주었다.
방안
1) 문제 속에 힌트가 있다. 문제는 항상 꼼꼼히 읽어보는게 좋다.
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 | package baekjoon.swtest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Q14499 { static int n,m,x,y,k; static int[][] arr,dice; static int[] order; public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); n = Integer.parseInt(st.nextToken()); // 지도 세로 크기 m = Integer.parseInt(st.nextToken()); // 지도 가로 크기 x = Integer.parseInt(st.nextToken()); // 주사위 놓을 곳 x y = Integer.parseInt(st.nextToken()); // 주사위 놓을 곳 y k = Integer.parseInt(st.nextToken()); // 명령의 개수 // 예제에서 주사위의 전개도를 주었다. 이를 이용해 주사위를 표현해보자. dice = new int[4][3]; arr = new int[n][m]; 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()); } // 명령 저장 order = new int[k]; st = new StringTokenizer(br.readLine()); for(int i=0;i<k;i++) order[i] = Integer.parseInt(st.nextToken()); solve(); } // 주사위의 윗면은 항상 dice[1][3] // 주사위를 굴리자!(우 좌 상 하) private static void change(int k) { int t = 0,up=0,bottom=0,left=0,right=0; switch (k) { case 1: // 오른쪽으로 굴림(바닥기준으로 앞 뒤는 동일) // 우측->바닥, 바닥->좌측, 좌측->윗면, 윗면->우측 up = dice[3][1]; bottom = dice[1][1]; left = dice[1][0]; right = dice[1][2]; dice[1][1]=right; dice[1][0]=bottom; dice[3][1]=left; dice[1][2]=up; break; case 2: // 왼쪽으로 굴림 // 우측->윗면, 바닥->우측, 좌측->바닥, 윗면->좌측 up = dice[3][1]; bottom = dice[1][1]; left = dice[1][0]; right = dice[1][2]; dice[1][1]=left; dice[1][0]=up; dice[3][1]=right; dice[1][2]=bottom; break; case 3: // 위로 굴림(좌 우는 동일) t = dice[3][1]; for(int i=3;i>0;i--) dice[i][1] = dice[i-1][1]; dice[0][1] = t; break; case 4: // 아래로 굴림(좌 우는 동일) t = dice[0][1]; for(int i=0;i<3;i++) dice[i][1] = dice[i+1][1]; dice[3][1] = t; break; } } // 우 좌 상 하 1 2 3 4 static int[][] dir = {{0,1},{0,-1},{-1,0},{1,0}}; private static void solve() { for(int i=0;i<k;i++) { x = x+dir[order[i]-1][0]; y = y+dir[order[i]-1][1]; if(x>=n || x<0 || y>=m || y<0) { // 지도 밖으로 나가는 경우 원상 복귀 시켜준후 다음 명령 x = x-dir[order[i]-1][0]; y = y-dir[order[i]-1][1]; continue; } // 굴리기 change(order[i]); // 아랫면 숫자 바꿔주기 // 이동한 칸의 수가 0이면 바닥면 수가 칸에 복사 if(arr[x][y]==0) arr[x][y]=dice[1][1]; else { // 아닐 경우는 반대 & 칸에 쓰여있는 수가 0인된다. dice[1][1] = arr[x][y]; arr[x][y] = 0; } // 윗면 출력 System.out.println(dice[3][1]); } } } |
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 14502번 연구소 (0) | 2018.10.18 |
---|---|
[백준] 14890번 경사로 (0) | 2018.10.18 |
[백준] 15684번 사다리 조작 (0) | 2018.10.17 |
[백준] 15686번 치킨 배달 (2) | 2018.10.16 |
[백준] 2309번 일곱 난쟁이 (0) | 2018.10.16 |
- Total
- Today
- Yesterday