자바/코드트리

[코드트리] n x n 표 채우기 - 자바(Java)

Jakorithm 2024. 8. 4. 03:22
728x90

문제

https://www.codetree.ai/problems/populate-an-n-x-n-table?&utm_source=clipboard&utm_medium=text

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

 

 

홀수인 자연수 n이 주어졌을 때, 다음과 같은 방식으로 1부터 n까지의 정수를 n x n 표 위에 채워나가려 합니다.

n과 m이 주어졌을 때, 이 표와 m이 해당 표의 어느 위치에 적혀있는지를 구하는 프로그램을 작성해 보세요.

 

입력 예시

6
1 2 3 5 7 11

 

출력 예시

5

 

 

코드

첫 번째 줄에 홀수인 자연수 N이 주어집니다.

둘째 줄에는 위치를 찾고자 하는 자연수 m이 하나 주어집니다.

  • 3 ≤ n ≤ 500
  • 1 ≤ m ≤ n^2

 

n개의 줄에 걸쳐 각 위치에 맞는 문자를 출력합니다.

n+1 번째 줄에는 입력받은 자연수가 놓여 있는 위치에 해당하는 행, 열 값을 공백을 두고 출력합니다.

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int n = Integer.parseInt(br.readLine()); // 배열의 크기 n
        int m = Integer.parseInt(br.readLine()); // 찾을 숫자 m
        br.close();

        // n x n 크기 배열 선언
        int[][] arr = new int[n][n];
        int current = n * n; // 최대 수
        int x = 0; // 시작 인덱스
        int y = n - 1; // 끝 인덱스

        while (current > 0) {
            // 열 채우기 (위에서 아래)
            for (int i = x; i <= y; i++) {
                arr[i][x] = current;
                current -= 1;
            }

            // x + 1부터 행 채우기 (왼쪽에서 오른쪽)
            for (int i = x + 1; i <= y; i++) {
                arr[y][i] = current;
                current -= 1;
            }

            // y - 1부터 열 채우기 (아래에서 위)
            for (int i = y - 1; i >= x; i--) {
                arr[i][y] = current;
                current -= 1;
            }

            // y - 1부터 행 채우기 (오른쪽에서 왼쪽)
            for (int i = y - 1; i > x; i--) {
                arr[x][i] = current;
                current -= 1;
            }

            x++; // x 인덱스 증가
            y--; // y 인덱스 감소
        }

        // 배열을 출력하기 위한 StringBuilder
        StringBuilder sb = new StringBuilder();
        int resultX = 0; // m의 X 위치
        int resultY = 0; // m의 y 위치

        // 2차원 배열 순회
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                // 배열 값 문자열 만들기
                sb.append(arr[i][j]).append(" ");

                // 현재 위치가 m이면 위치 값 저장
                if (arr[i][j] == m) {
                    resultX = i + 1;
                    resultY = j + 1;
                }
            }
            sb.append("\n"); // 개행
        }

        // m값 위치 문자열에 추가
        sb.append(resultX)
                .append(" ")
                .append(resultY);

        bw.write(sb.toString());
        bw.flush();
        bw.close();
    }
}

 

728x90