[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);
}



느낀점

생략

댓글남기기