코테/백준

99클럽 코테 스터디 12일차 TIL 구현(소용돌이 예쁘게 출력하기)

zsunny 2025. 2. 4. 23:23

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

 

사용 알고리즘

구현

 

아이디어

1. 주어진 입력 값의 시작점을 0, 0으로 옮기고, 이 크기의 배열 arr을 생성한다.

2. 이를 기준으로 했을 때 0, 0 지점 (-r1, -c1)부터 1을 소용돌이 모양으로 채운다.

3. dx, dy 배열로 우/상/좌/하 방향으로 이동할 수 있도록 한다.

4. 이때, 같은 방향으로 1, 2, 3, ... 씩 증가하며 움직이는 게 2번씩 반복된다.

(즉, 우 -> 상 -> 좌 -> 좌 -> 하 -> 하 -> 우 -> 우 -> 우 -> 상 -> 상 -> 상 -> ... 식으로 늘어나는 규칙의 코드를 반복문으로 짜야 함)

5. 이동할 때 주어진 arr 배열 범위 밖이면 무시, 범위 안이면 배열에 값을 저장한다.

6. 이를 길이를 맞춰.. 오른쪽 정렬해 출력한다..

 

유의점

1. 출력 형식이 안맞아서 제일 골치 아팠다!!!

// String.format("%nd ", value) → n 자리 맞춰 출력

sb.append(String.format("%" + maxLen + "d", arr[i][j]));

...

제출코드

package BOJ.Implementation;

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

public class BOJ_1022_소용돌이예쁘게출력하기 {

    static int[] dx = {0, -1, 0, 1};
    static int[] dy = {1, 0, -1, 0};

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

        int x1 = Integer.parseInt(st.nextToken());
        int y1 = Integer.parseInt(st.nextToken());
        int x2 = Integer.parseInt(st.nextToken());
        int y2 = Integer.parseInt(st.nextToken());
        int n = Math.max(Math.abs(x1), Math.max(Math.abs(y1), Math.max(Math.abs(x2), Math.abs(y2))));

        int r = x2 - x1 + 1;
        int c = y2 - y1 + 1;

        int[][] arr = new int[r][c];

        int num = 2;
        int cnt = 1;
        int idx = 0;
        int x = -x1;
        int y = -y1;
        int color = r * c;
        if(x >= 0 && y >= 0 && x < r && y < c) {
            arr[x][y] = 1;
            color--;
        }
        boolean flag = false;
        int maxNum = 0;

        while(true){
            if(color == 0){
                flag = true;
                break;
            }
            for(int i=0; i<2; i++){
                for(int j=0; j<cnt; j++){
                    int nx = x + dx[idx % 4];
                    int ny = y + dy[idx % 4];
                    if(nx < 0 || ny < 0  || nx >= r || ny >= c) {
                        x = nx;
                        y = ny;
                        num++;
                        continue;
                    }
                    maxNum = Math.max(maxNum, num);
                    arr[nx][ny] = num++;
                    color--;
                    x = nx;
                    y = ny;
                }
                if(flag) break;
                idx++;
            }
            if(flag) break;
            cnt++;
        }

        int maxLen = String.valueOf(maxNum).length();

        StringBuilder sb = new StringBuilder();
        for(int i=0; i<r; i++){
            for(int j=0; j<c; j++){
                if (j > 0) sb.append(" ");
                sb.append(String.format("%" + maxLen + "d", arr[i][j]));
            }
            if (i < r-1) sb.append("\n");
        }
        System.out.println(sb.toString());
    }
}