[BOJ] 1022 - 소용돌이 예쁘게 출력하기(G4)

suhyun·2022년 11월 28일
0

백준/프로그래머스

목록 보기
39/81

문제 링크

1022-소용돌이 예쁘게 출력하기


입력

첫째 줄에 네 정수 r1, c1, r2, c2가 주어진다.


출력

r2 - r1 + 1개의 줄에 소용돌이를 예쁘게 출력한다.

예쁘게 출력한다는 것은 다음과 같이 출력하는 것이다.

  1. 출력은 r1행부터 r2행까지 차례대로 출력한다.
  2. 각 원소는 공백으로 구분한다.
  3. 모든 행은 같은 길이를 가져야 한다.
  4. 공백의 길이는 최소로 해야 한다.
  5. 모든 숫자의 길이(앞에 붙는 공백을 포함)는 같아야 한다.
  6. 만약 수의 길이가 가장 길이가 긴 수보다 작다면, 왼쪽에서부터 공백을 삽입해 길이를 맞춘다.

문제 풀이

우선 이차원 배열 만들고
dx,dy 일차원 배열 만드는거까지는 당연한 과정

isFinish 함수를 이용해서 배열의 모든 값을 채웠는지 확인하며
방향 전환하며 배열 값 채워나가기

여기서 함정은 출력 형식이었다.
그냥 공백으로 출력하면 안되고 위의 조건들은 만족해야해서
formatter 를 통해 처리했다.

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

public class Main {

    static int[][] map;
    static int r1, c1, r2, c2, max = 0;
    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());

        r1 = Integer.parseInt(st.nextToken());
        c1 = Integer.parseInt(st.nextToken());
        r2 = Integer.parseInt(st.nextToken());
        c2 = Integer.parseInt(st.nextToken());
        map = new int[r2 - r1 + 1][c2 - c1 + 1];

        fill();

        StringBuilder formatter = new StringBuilder("%");
        formatter.append(String.valueOf(max).length());
        formatter.append("d ");

        for (int i = 0; i <= r2 - r1; i++) {
            for (int j = 0; j <= c2 - c1; j++) {
                System.out.printf(formatter.toString(), map[i][j]);
            }
            System.out.println();
        }

    }

    private static void fill() {
        int x = 0, y = 0, dir = 0;
        int num = 1, dnum = 1, cnt = 0;

        while (!isFinish()) {
            if (x >= r1 && x <= r2 && y >= c1 && y <= c2) {
                map[x - r1][y - c1] = num;
            }
            num++;
            cnt++;
            x = x + dx[dir];
            y = y + dy[dir];

            if (cnt == dnum) {
                cnt = 0;
                if (dir == 1 || dir == 3) dnum++;
                dir = (dir + 1) % 4;
            }
        }
        max = num - 1;
    }

    private static boolean isFinish() {
        return map[0][0] != 0 && map[r2 - r1][0] != 0 && map[0][c2 - c1] != 0 && map[r2 - r1][c2 - c1] != 0;
    }
}
profile
꾸준히 하려고 노력하는 편 💻

0개의 댓글