[백준]1913번 달팽이

[백준]1913번 달팽이

1913번: 달팽이

문제 풀이

(1:30)

작년 하반기 부터 보던 코테에서 이런 문제가 굉장히 많이 나오고 있고 나는 매 번 풀 지 못하고 있다.

레벨은 낮은 문제임에도 마냥 어렵게 느껴졌다.

import java.io.*;
import java.util.*;

public class Main {

  public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  public static int parseInt(String target){ return Integer.parseInt(target);}
  public static StringTokenizer st;
  public static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

  public static int target;
  public static int tr, tc; // target 위치
  public static int n;
  public static int[][] board;
  public static int[][] dirs = new int[][]{{0,1},{0,-1},{1,0},{-1,0}}; // 오른쪽, 왼쪽, 아래, 위

  public static void setting() throws IOException {
    n = Integer.parseInt(br.readLine());
    board = new int[n][n];
    target = Integer.parseInt(br.readLine());
  }
  public static void fill(){
    int circle = n/2; // 바퀴 수
    // 현재 위치
    int[] loc = new int[2];
    loc[0] = circle;
    loc[1] = circle;
    board[loc[0]][loc[1]] = 1;

    int movNumb = 1;
    // 이동 횟수
    // n 은 항상 홀수이기 때문에 (위, 오른쪽, 아래, 왼쪽, 위 ) 의 패턴을 계속한다
    int cnt = 2;
    int circleCnt = 0;

    while (circleCnt < circle){
      // 맨 처음에는 위로 한 칸 이동 하는 거로 시작
      cnt = move(loc, 3, 1, cnt);
      // 오른쪽 이동
      cnt = move(loc, 0, movNumb, cnt);
      // 아래로 이동
      movNumb++;
      cnt = move(loc, 2, movNumb, cnt);

      // 왼쪽 이동
      cnt = move(loc, 1, movNumb, cnt);

      // 마지막에 위로 이동
      cnt = move(loc, 3, movNumb, cnt);
      movNumb++;
      circleCnt++;
    }

    // target 이 1 인 경우는 따로 업데이트 ( 시작 cnt 를 2로 했어서 )
    if (target == 1) {
      tr = circle; tc = circle;
    }

  }
  // 정답 출력 메소드 
  public static void printBoard() throws IOException{
    for(int r = 0 ; r<n;r++){
      for(int c =0;c<n;c++)
        bw.write(board[r][c]+" ");
      bw.write("\n");
    }
    bw.write((tr+1)+" "+(tc+1)+"\n");
    bw.flush();
    bw.close();
  }
  // 현재위치, 방향, 이동횟수
  public static int move(int[] loc, int dir, int movCnt, int cnt){
    for(int cur = 0 ; cur < movCnt; cur++){
      loc[0] += dirs[dir][0];
      loc[1] += dirs[dir][1];
      board[loc[0]][loc[1]] = cnt++; // board 에 값을 채워 넣는다
      // target 칸 인 경우
      if( board[loc[0]][loc[1]] == target){
        tr = loc[0];
        tc = loc[1];
      }
    }
    return cnt;
  }
  
  public static void main(String[] args)throws IOException {
    setting();
    fill();
    printBoard();
  }
}

좋은 웹페이지 즐겨찾기