티스토리 뷰

학기 중에는 해설 로직을 담지 않습니다.

문제

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

 

1913번: 달팽이

N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서

www.acmicpc.net

언어

자바 Java

코드

(0,0)부터 시작하여 안쪽으로 돌아가도록 코드를 작성하였습니다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    private static final int[] dx = {0, 1, 0, -1};
    private static final int[] dy = {1, 0, -1, 0};
    private static int[][] map;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int n = Integer.parseInt(br.readLine());
        int findNum = Integer.parseInt(br.readLine());

        map = new int[n][n];
        fillMap(n * n);

        for (int i = 0; i < map.length; i++) {
            for (int j = 0; j < map[i].length; j++) {
                sb.append(map[i][j] + " ");
            }
            sb.append("\n");
        }

        String[] find = findNum(findNum);
        sb.append(find[0] + " " + find[1]);

        System.out.println(sb);
    }

    private static void fillMap(int startNum) {
        int x = 0, y = -1, d = 0; // y가 -1부터 시작하는 이유는 dy[0] == 1이기 때문에 y + dy[0] = 0이므로 (0,0)부터 숫자를 채우게 된다.
        while (true) {
            if (startNum == 0)
                break;
            int ny = y + dy[d];
            int nx = x + dx[d];
            if (ny < 0 || ny >= map.length || nx < 0 || nx >= map[ny].length || map[ny][nx] != 0) {
                if (d == 3)
                    d = 0;
                else
                    d += 1;
                continue;
            }
            map[ny][nx] = startNum--;
            y = ny;
            x = nx;
        }
    }

    private static String[] findNum(int findNum) {
        for (int y = 0; y < map.length; y++) {
            for (int x = 0; x < map[y].length; x++) {
                if (map[y][x] == findNum)
                    return new String[]{y + 1 + "", x + 1 + ""};
            }
        }
        return null;
    }
}
Total
Today
Yesterday
최근에 올라온 글
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30