
내가 생각했을때 문제에서 원하는부분
첫째 줄에 홀수인 자연수 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();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.