백준 달팽이

KIMYEONGJUN·2025년 3월 5일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

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

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

내가 이 문제를 보고 생각해본 부분

변수 선언: N은 배열의 크기, A는 찾고자 하는 숫자를 저장합니다. arr은 N×N 배열을 나타내며, dx와 dy는 배열에서 이동할 방향을 정의해준다.
입력 처리: BufferedReader를 사용하여 N과 A를 입력받는다.
배열 초기화: N×N 크기의 배열을 생성하고, 시작 위치 (0, 0)에 N²를 설정한다.
달팽이 숫자 채우기: 현재 위치에서 숫자를 채우고, 방향을 바꾸며 배열을 탐색합니다. 유효한 위치에 숫자가 채워질 때까지 반복한다.
좌표 찾기 및 출력: 배열을 순회하면서 숫자 A의 좌표를 찾고, 배열의 내용을 StringBuilder에 저장한 후, 최종적으로 해당 좌표를 포함해 출력한다.

코드로 구현

package baekjoon.baekjoon_27;

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

// 백준 1913번 문제
public class Main952 {
    static int N;
    static int A;
    static int[][] arr;

    // 방향: 아래, 오른쪽, 위, 왼쪽
    static int[] dx = {1, 0, -1, 0};
    static int[] dy = {0, 1, 0, -1};

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

        N = Integer.parseInt(br.readLine()); // 달팽이 한 변의 길이
        A = Integer.parseInt(br.readLine()); // 찾아야 하는 수

        arr = new int[N][N]; // 출력할 N * N 배열

        int curX = 0, curY = 0; // 시작 좌표
        arr[curX][curY] = N * N; // 시작할 숫자

        int num = N * N - 1; // 다음에 넣을 숫자
        int idx = 0; // 방향 인덱스

        while(num > 0) {
            int nx = curX + dx[idx];
            int ny = curY + dy[idx];

            // 다음 좌표가 유효한지 확인
            if(nx >= 0 && ny >= 0 && nx < N && ny < N && arr[nx][ny] == 0) {
                arr[nx][ny] = num--; // 현재 숫자를 넣고 감소
                curX = nx; // 현재 좌표 갱신
                curY = ny;
            } else {
                idx++; // 방향 변경
                if(idx >= 4) {
                    idx = 0; // 방향 인덱스 초기화
                }
            }
        }

        int ansX = 0; // 찾아야 하는 수의 좌표 변수
        int ansY = 0; // 찾아야 하는 수의 좌표 변수

        // 정답 출력
        for(int i = 0; i < N; i++) {
            for(int j = 0; j < N; j++) {
                if(arr[i][j] == A) {
                    ansX = i + 1; // 1-based index
                    ansY = j + 1; // 1-based index
                }
                sb.append(arr[i][j]).append(" ");
            }
            sb.append("\n");
        }
        sb.append(ansX).append(" ").append(ansY);
        System.out.print(sb);
        br.close();
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글