Algorithm/Implementation

[Baekjoon 1913 / Java / 실버3] 달팽이

양선규 2024. 4. 26. 14:20
728x90
반응형
 

문제

 

import java.io.*;

public class 달팽이_1913 {
    public static void main(String[] args) throws Exception {
       
        StringBuilder sb = new StringBuilder();
       
        // 입력받기
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int target = Integer.parseInt(br.readLine());

        // 2차원 배열 생성
        int board[][] = new int[N][N];
        int resultX = Integer.MIN_VALUE;
        int resultY = Integer.MIN_VALUE;

        // 시작 좌표
        int x = N / 2;
        int y = N / 2;

        // 첫 숫자는 먼저 입력해 둔다
        board[x][y] = 1;
        int num = 2;
        for(int i = 1; i < N; i++) {

            // i가 홀수일 때, x는 줄어들고 y는 늘어난다
            if(i % 2 == 1) {
                for(int j = 1; j < i+1; j++) {
                    x -= 1;
                    board[x][y] = num;
                    num += 1;
                }
                for(int j = 1; j < i+1; j++) {
                    y += 1;
                    board[x][y] = num;
                    num += 1;
                }
            }

            // i가 짝수일 때, x는 늘어나고 y는 줄어든다
            else {
                for(int j = 1; j < i+1; j++) {
                    x += 1;
                    board[x][y] = num;
                    num += 1;
                }
                for(int j = 1; j < i+1; j++) {
                    y -= 1;
                    board[x][y] = num;
                    num += 1;
                }
            }

            // 마지막 반복엔 x를 한번 더 빼준다
            if(i == N - 1) {
                for(int j = 1; j < i+1; j++) {
                    x -= 1;
                    board[x][y] = num;
                    num += 1;
                }
            }
        }

        // 출력
        for(int i = 0; i < N; i ++) {
            for(int j = 0; j < N; j ++) {
                sb.append(board[i][j]).append(" ");
                if(board[i][j] == target) {
                    resultX = i + 1;
                    resultY = j + 1;
                }
            }
            sb.append("\n");
        }

        System.out.print(sb.toString());
        System.out.printf("%d %d", resultX, resultY);
    }
}

 

숫자가 입력되는 위치에 규칙이 있다.

 

x좌표가 줄어들 땐 y좌표가 늘어난다.

y좌표가 늘어날 땐 x좌표가 줄어든다. 서로 번갈아가면서 늘어나거나 줄어든다.

 

for문은 i값을 1 ~ N - 1 로 설정한다.

i값 만큼 x좌표와 y좌표가 변한다.

또한 i가 홀수일 땐 x좌표가 줄어들고 y 좌표가 늘어나고, 짝수면 반대다.

 

N이 3일 경우, 

i가 1 일 때, x는 한 번 줄어들고 y는 한 번 늘어난다.

i가 2 일 때, x는 두 번 늘어나고 y는 두 번 줄어든다.

i가 N - 1(2)에 도달하면, 추가로 마지막에 i번 만큼 x를 줄여준다.

 

N이 5일 경우,

i가 1 일 때, x는 한 번 줄어들고 y는 한 번 늘어난다.

i가 2 일 때, x는 두 번 늘어나고 y는 두 번 줄어든다.

i가 3 일 때, x는 세 번 줄어들고 y는 세 번 늘어난다.

i가 4 일 때, x는 네 번 늘어나고 y는 네 번 줄어든다.

i가 N - 1(4)에 도달하면, 마지막에 i번 만큼 x를 줄여준다.

 

x 또는 y를 한번 늘리거나 줄일 때마다(좌표가 변할 때마다) 1추가된 값을 배열의 해당 위치에 저장하면 된다.

 

그냥 print문으로 출력하니 메모리 초과가 떴다. 출력량이 매우 많아서 그런 듯 한데, StringBuilder를 이용하니 무난하게 통과되었다.

728x90
반응형