[java]주사위 굴리기 - 백준14499
문제
풀이
문제 해석을 하자면,
- 주사위를 굴려 문제의 조건에 맞게 주사위와 맵을 갱신한다.
- 주사위를 “좌, 우” 던질 때 갱신되는 부분을 꼭 잘 캐치할 것
풀이
- 다음과 같은 순서로 구현하자.
- 주사위 던져 갱신 -> 복잡하며 이부분만 잘 구현하면 나머지는 간단
-
updateDice
함수 구현한것을 잘 확인할 것 (직접 손으로 그려보는것을 추천) - 특히, diceCol, diceRow 겹치는 부분을 꼭 주의. 생각보다 직접 안그려보면 햇갈린다.
-
- 주사위 던져 inArr(맵) 갱신
코드
public static int N, M;
public static int cx, cy;
public static int[] diceRow = {0, 0, 0}; // diceCol와 겹치는 부분 주의
public static int[] diceCol = {0, 0, 0, 0}; // diceRow와 겹치는 부분 주의
public static int[] dx = {0,0,-1,1};
public static int[] dy = {1,-1,0,0};
public static void updateDice(int dir) {
if(dir == 1) {
int temp = diceRow[2];
for(int i=2; i>0; i--) {
diceRow[i] = diceRow[i-1];
}
diceRow[0] = diceCol[3];
diceCol[3] = temp;
diceCol[1] = diceRow[1]; // 필수
}else if(dir == 2) {
int temp = diceRow[0];
for(int i=0; i<2; i++) {
diceRow[i] = diceRow[i+1];
}
diceRow[2] = diceCol[3];
diceCol[3] = temp;
diceCol[1] = diceRow[1]; // 필수
}else if(dir == 3) {
int temp = diceCol[3];
for(int i=3; i>0; i--) {
diceCol[i] = diceCol[i-1];
}
diceCol[0] = temp;
diceRow[1] = diceCol[1]; // 필수
}else if(dir == 4) {
int temp = diceCol[0];
for(int i=0; i<3; i++) {
diceCol[i] = diceCol[i+1];
}
diceCol[3] = temp;
diceRow[1] = diceCol[1]; // 필수(윗면 겹치기 때문)
}
}
public static boolean moveDice(int dir, int[][] inArr) {
int nx = cx+dx[dir-1];
int ny = cy+dy[dir-1];
if(nx<0||ny<0||nx>=N||ny>=M) return false; // 범위 체크
cx = nx; cy = ny; // update(전역변수)
// 1. 주사위 갱신
updateDice(dir);
// 2. inArr(맵) 갱신
if(inArr[nx][ny]==0) {
// 주사위 바닥 -> (맵)칸에 복제
inArr[nx][ny] = diceCol[3];
}else {
// 반대로 복제 후 (맵)칸에 0 처리
diceCol[3] = inArr[nx][ny];
inArr[nx][ny] = 0;
}
return true;
}
public static void main(String[] args) throws Exception{
//input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer stk = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(stk.nextToken());
M = Integer.parseInt(stk.nextToken());
cx = Integer.parseInt(stk.nextToken());
cy = Integer.parseInt(stk.nextToken());
int K = Integer.parseInt(stk.nextToken());
int[][] inArr = new int[N+1][M+1];
for(int i=0; i<N; i++) {
stk = new StringTokenizer(br.readLine(), " ");
for(int j=0; j<M; j++) {
inArr[i][j] = Integer.parseInt(stk.nextToken());
}
}
//run
stk = new StringTokenizer(br.readLine(), " ");
for(int k=0; k<K; k++) {
int order = Integer.parseInt(stk.nextToken());
boolean chk = moveDice(order, inArr);
if(chk) sb.append(diceRow[1]).append("\n"); // 범위내에만 출력
}
//output
System.out.print(sb);
}
느낀점
생략
댓글남기기