티스토리 뷰

PS/BOJ

[ 구현 ] 1913번 달팽이

GiHoo 2023. 6. 22. 09:54

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

 

1913번: 달팽이

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

www.acmicpc.net

 


문제

 


접근 방법

달팽이가 움직이는 모습은 위와 같다. 

시작점을 먼저 찾고 ( N/2, N/2 ) 

시작점을 기준으로 움직일 수 있는 범위를 제한하여 구동하면 된다.

예를 들어 1->2, 2->3을 갈때는 최대 한 칸만 움직일 수 있지만

3->5, 7->10 등 움직일 수 있는 범위가 늘어나는 포인트가 생긴다.

이 포인트들은 달팽이가 위, 아래로 움직일 때 (x,y에서 x값이 증가하거나 감소할 때) 이다.

 

즉, 이 포인트들 전 범위를 증가시키고 상 -> 우 -> 하 -> 좌 를 반복하면 0,0 위치까지 도달할 수 있다.

 

 


코드 

 

import java.io.*;
import java.util.*;

class Main {
    private static int N;
    private static int[][] matrix;
    static int[] mx = {0, 1, 0, -1};
    static int[] my = {1, 0, -1, 0};

    static void fillMatrix() {
        int tmp = 0;
        int x = N/2;
        int y = N/2; // 1이 위치할 좌표
        int range = 1;
        matrix[x][y] = tmp++;
        while(true) {
            for(int i=0; i<range; i++) {
                matrix[x--][y] = tmp++;
            } //상
            if(tmp-1 == N*N) break;
           
            for(int i=0; i<range; i++) {
                matrix[x][y++] = tmp++;
            } //우
            range++; // 하로 가기 전 범위 증가
            
            for(int i=0; i<range; i++) {
                matrix[x++][y] = tmp++;
            } //하

            for(int i=0; i<range; i++) {
                matrix[x][y--] = tmp++;
            } //좌
            range++; /상 하기 전 범위 증가
        }
    }

    static String printMatrix() {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                sb.append(matrix[i][j]).append(" ");
            }
            sb.append("\n");
        }
        return sb.toString();
    }

    static String findCoordinate(int findNumber) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if(matrix[i][j] == findNumber) {
                    sb.append(i+1).append(" ").append(j+1);
                }
            }
        }
        return sb.toString();
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        int findNumber = Integer.parseInt(br.readLine());
        matrix = new int[N][N];
        fillMatrix();
        System.out.print(printMatrix());
        System.out.print(findCoordinate(findNumber));;
    }
}
공지사항
최근에 올라온 글
최근에 달린 댓글
«   2024/09   »
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