❓ 문제 - 백준 주사위 굴리기 14499번 - JAVA 풀이법
출처
(https://www.acmicpc.net/problem/14499)
📝 문제해결법
1. 이 문제는 구현으로 풀었다.
- 주사위의 윗면 - 바닥면 - 앞면 - 뒷면 - 왼쪽면 - 오른쪽면에 대한 값들을 dice 배열을 통해 저장
- 지도의 값을 map를 통해 저장한다.
- 주사위를 움직일 때 dx, dy(동-0, 서-1, 북-2, 남-3)를 이용해서 움직이려는 곳이 지도 밖이면 움직이지 않게 한다.
- 주사위를 움직일 때 동,서,북,남 방향에 맞춰서 move_right(), move_left(), move_up(), move_down() 함수를 호출하여 주사위를 해당 방향으로 움직인다.
- 만약 움직였을 때 해당 지도의 값이 0이면 주사위의 바닥면(dice[1])의 값을 지도에 복사한다.
- 만약 움직였을 때 해당 지도의 값이 0이 아니면 바닥면(dice[1])에 지도의 값을 복사한 후 지도 값을 0으로 변경한다.
2. 주사위 굴림 구현
- move_right() : 주사위 동쪽으로 굴리면 주사위의 값들이 윗 -> 오 -> 바닥 -> 왼 -> 윗 으로 이동하는 것을 구현한다.
- move_left() : 주사위 서쪽으로 굴리면 주사위의 값들이 윗 -> 왼 -> 바 -> 오 -> 윗 으로 이동하는 것을 구현한다.
- move_up() : 주사위 북쪽으로 굴리면 주사위의 값들이 윗 -> 뒷 -> 바 -> 앞 -> 윗 으로 이동하는 것을 구현한다.
- move_down() : 주사위 남쪽으로 굴리면 주사위의 값들이 윗 -> 앞 -> 바 -> 뒷 -> 윗 으로 이동하는 것을 구현한다.
3. 느낀점
- 저번에 풀었던 파이썬 방식과 유사하게 빡구현으로 이동 방향에 맞춰 다 구현해줬다.
- 혹시나 다른 사람들의 풀이를 참고했지만 다 이런식으로 구현하신듯하다...!
💻 소스코드
// BOJ - 주사위 굴리기(14499번)
// 구현
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main_14499 {
public static int n, m, x, y, k;
public static int[][] map;
// 동, 서, 북, 남
public static int[] dx = {0, 0, -1, 1};
public static int[] dy = {1, -1, 0, 0};
// 윗면, 바닥면, 앞면, 뒷면, 왼쪽면, 오른쪽면
public static int[] dice = {0, 0, 0, 0, 0, 0};
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());
y = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
map = new int[n][m];
for(int i=0;i<n;i++) {
st = new StringTokenizer(br.readLine(), " ");
for(int j=0;j<m;j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
st = new StringTokenizer(br.readLine(), " ");
for(int i=0;i<k;i++) {
int move = Integer.parseInt(st.nextToken()) - 1;
x += dx[move];
y += dy[move];
if(x < 0 || x >= n || y < 0 || y >= m) {
x -= dx[move];
y -= dy[move];
continue;
}
switch(move) {
case 0:
move_right();
break;
case 1:
move_left();
break;
case 2:
move_up();
break;
case 3:
move_down();
break;
}
// 바닥면 복사
if(map[x][y] == 0) {
map[x][y] = dice[1];
} else {
dice[1] = map[x][y];
map[x][y] = 0;
}
System.out.println(dice[0]);
}
}
public static void move_right() {
// 윗 -> 오 -> 바닥 -> 왼 -> 윗
int temp = dice[0];
dice[0] = dice[4];
dice[4] = dice[1];
dice[1] = dice[5];
dice[5] = temp;
}
public static void move_left() {
// 윗 -> 왼 -> 바 -> 오 -> 윗
int temp = dice[0];
dice[0] = dice[5];
dice[5] = dice[1];
dice[1] = dice[4];
dice[4] = temp;
}
public static void move_up() {
// 윗 -> 뒷 -> 바 -> 앞 -> 윗
int temp = dice[0];
dice[0] = dice[2];
dice[2] = dice[1];
dice[1] = dice[3];
dice[3] = temp;
}
public static void move_down() {
// 윗 -> 앞 -> 바 -> 뒷 -> 윗
int temp = dice[0];
dice[0] = dice[3];
dice[3] = dice[1];
dice[1] = dice[2];
dice[2] = temp;
}
}
'알고리즘 > 알고리즘문풀' 카테고리의 다른 글
BOJ - 로봇 청소기 14503번 (JAVA) (0) | 2022.04.17 |
---|---|
BOJ - 테트로미노 14500번 (JAVA) (0) | 2022.04.12 |
BOJ - 시험 감독 13485번 (JAVA) (0) | 2022.04.08 |
BOJ - 뱀 3190번 (JAVA) (0) | 2022.04.08 |
BOJ - 연구소 14502번 (JAVA) (0) | 2022.04.08 |