백준 1913번 달팽이 Java

: ) YOUNG·2024년 8월 10일
1

알고리즘

목록 보기
394/422
post-thumbnail

백준 1913번 달팽이 Java

https://www.acmicpc.net/problem/1913

문제



생각하기


  • 구현 문제이다.


동작

배열 회전 순서에 따라서 dir만 순서에 맞게 구현해주면 된다.

규칙이 있을거라고 생각해서 rowIdxcolIdx만 계속 증가 감소 규칙대로 구현했는데,

생각해보니까 그냥 DFS/BFS 푸는 방식대로 똑같이 구현해도 크게 쉽게 풀 수 있는 문제였다.



결과


코드


import java.io.*;

public class Main {

    // input
    private static BufferedReader br;

    // variables
    private static int N, M;
    private static int[][] arr;

    public static void main(String[] args) throws IOException {
        br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        input();

        bw.write(solve());
        bw.close();
    } // End of main()

    private static String solve() {
        StringBuilder sb = new StringBuilder();
        int x = 0;
        int y = 0;
        int num = N * N;
        int[] dirX = {1, 0, -1, 0};
        int[] dirY = {0, 1, 0, -1};
        int nowDir = 0;
        int targetX = 0;
        int targetY = 0;

        while (num > 0) {
            arr[x][y] = num;

            if (num == M) {
                targetX = x + 1;
                targetY = y + 1;
            }

            int nextX = x + dirX[nowDir];
            int nextY = y + dirY[nowDir];

            if (!isAbleCheck(nextX, nextY)) {
                nowDir = (nowDir + 1) % 4;
                nextX = x + dirX[nowDir];
                nextY = y + dirY[nowDir];
            }

            x = nextX;
            y = nextY;
            num--;
        }

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                sb.append(arr[i][j]).append(' ');
            }
            sb.append('\n');
        }
        sb.append(targetX).append(' ').append(targetY);
        return sb.toString();
    } // End of solve()

    private static boolean isAbleCheck(int nextX, int nextY) {
        return nextX >= 0 && nextX < N && nextY >= 0 && nextY < N && arr[nextX][nextY] == 0;
    } // End of isAbleCheck()

    private static void input() throws IOException {
        N = Integer.parseInt(br.readLine());
        M = Integer.parseInt(br.readLine());

        arr = new int[N][N];
    } // End of input()
} // End of Main class

0개의 댓글