백준 1913번: 달팽이

알고리즘백준Java코딩 테스트
avatar
2025.06.02
·
7 min read

문제

홀수인 자연수 N이 주어지면, 다음과 같이 1부터 N2까지의 자연수를 달팽이 모양으로 N×N의 표에 채울 수 있다.

9

2

3

8

1

4

7

6

5

25

10

11

12

13

24

9

2

3

14

23

8

1

4

15

22

7

6

5

16

21

20

19

18

17

N이 주어졌을 때, 이러한 표를 출력하는 프로그램을 작성하시오. 또한 N2 이하의 자연수가 하나 주어졌을 때, 그 좌표도 함께 출력하시오. 예를 들어 N=5인 경우 6의 좌표는 (4,3)이다.

입력

첫째 줄에 홀수인 자연수 N(3 ≤ N ≤ 999)이 주어진다. 둘째 줄에는 위치를 찾고자 하는 N2 이하의 자연수가 하나 주어진다.

출력

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


나의 풀이

방향을 위 → 오른쪽 → 아래 → 왼쪽 순서로 움직이며 숫자를 채웁니다.

나의 코드

import java.io.*;

/**
 * 백준 1913 - 달팽이 (실버 3)
 * https://www.acmicpc.net/problem/1913
 */
public class Main {

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

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

        int[][] map = new int[n][n];
        int value = 1;

        int row = n / 2, col = n / 2;
        int limit = 1;

        // 방향별 이동: 상, 우, 하, 좌
        while (value <= n * n) {
            // 상
            for (int i = 0; i < limit && value <= n * n; i++) {
                map[row--][col] = value++;
            }
            // 우
            for (int i = 0; i < limit && value <= n * n; i++) {
                map[row][col++] = value++;
            }
            limit++;

            // 하
            for (int i = 0; i < limit && value <= n * n; i++) {
                map[row++][col] = value++;
            }
            // 좌
            for (int i = 0; i < limit && value <= n * n; i++) {
                map[row][col--] = value++;
            }
            limit++;
        }

        StringBuilder sb = new StringBuilder();
        int tx = 0, ty = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                sb.append(map[i][j]);
                if (j < n - 1) sb.append(" ");
                if (map[i][j] == t) {
                    ty = i + 1;
                    tx = j + 1;
                }
            }
            sb.append("\n");
        }
        sb.append(ty).append(" ").append(tx);
        System.out.print(sb);
    }
}






- 컬렉션 아티클