백준 1913번 달팽이

이상민·2023년 9월 15일
0

알고리즘

목록 보기
53/128
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Snail {
    static int N;
    static int answer;
    static int[][] map;
    static int dr[] = {-1,0,1,0};
    static int dc[] = {0,1,0,-1};
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        answer = Integer.parseInt(br.readLine());
        map = new int[N + 1][N + 1];
        int num = N / 2 + 1;
        dfs(num,num,1,3);
        int row=0;
        int col = 0;
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i < N+1; i++) {
            for (int j = 1; j < N+1; j++) {
                sb.append(map[i][j]).append(" ");
                if(map[i][j]==answer){
                    row =i;
                    col = j;
                }
            }
            sb.append("\n");
        }
        System.out.print(sb);
        System.out.println(row+" "+col);
    }
    public static void dfs(int row, int col,int count,int dir){
        map[row][col] = count;
        int ndir = (dir+1)%4;
        if(map[row+dr[ndir]][col+dc[ndir]]==0) {
            dir = ndir;
        }
        row += dr[dir];
        col += dc[dir];
        if(row<1||col<1||row>=N+1||col>=N+1)
            return;
        dfs(row,col,count+1,dir);
    }

}

풀이방법

달팽이는 위,오,아,왼 순으로 움직인다. 해당 순서대로 방향을 바꿔주며, 언제 방향을 유지할지, 언제 방향을 다음방향으로 바꿀지를 기준으로 설계한다.

  1. 달팽이의 시작좌표 (N / 2 + 1,N / 2 + 1) 부터 출발한다.
  2. 해당 좌표에 count값을 넣어준다(초기값 1)
  3. 📢 다음방향에 해당하는 좌표값이 0이면, 방향을 바꿔주고, 0이 아니라면 방향을 바꾸지말고, 그대로 간다.
  4. 범위체크 후, count값을 증가시키며 재귀함수를 호출한다.

후기

풀면서 보니까 그렇게 어려운 풀이는 아닌거 같은데, 방향을 어떤식으로 바꿔줘야할지 설계하는데 어려웠다.
그리고 마지막에 출력시 system.out.println()으로 출력하면 시간초과가 나는데, StringBuilder()로 출력하면 통과가 된다.
StringBuilder가 빠른지 알게 되었다.

profile
개린이

0개의 댓글