Don't give up!

[백준] 1022번 : 소용돌이 예쁘게 출력하기 (java) 본문

Coding Test/BOJ

[백준] 1022번 : 소용돌이 예쁘게 출력하기 (java)

Heang Lee 2021. 8. 7. 20:42

1022번: 소용돌이 예쁘게 출력하기 (acmicpc.net)

 

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

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

www.acmicpc.net

어떻게 생각하고 문제를 풀었는가?

소용돌이는 가장 안쪽에서부터 n번째 테두리는 (2n-3)^2+1 ~ (2n-1)^2의 값을 갖습니다.

우측 테두리서부터 시작하여 +1이 진행되므로 상, 하, 좌, 우로 나누어 (a, b) 위치의 값을 식으로 나타낼 수 있다고 생각하였습니다.

코드

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

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer tokenizer = new StringTokenizer(reader.readLine());
        int r1 = Integer.parseInt(tokenizer.nextToken());
        int c1 = Integer.parseInt(tokenizer.nextToken());
        int r2 = Integer.parseInt(tokenizer.nextToken());
        int c2 = Integer.parseInt(tokenizer.nextToken());
        reader.close();

        int[][] vortex = new int[r2-r1+1][c2-c1+1];
        int max = 0;
        for(int i=r1; i<=r2; i++){
            for(int j=c1; j<=c2; j++){
                vortex[i-r1][j-c1] = calculate(i, j);
                max = Math.max(max, vortex[i-r1][j-c1]);
            }
        }

        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(), vortex[i][j]);
            }
            System.out.println();
        }
    }

    static int calculate(int row, int column){
        int border = Math.max(Math.abs(row),Math.abs(column));
        int min = (int) Math.pow(2*border-1,2)+1;

        if(row == border){
            return min + 7*border -1 + column;
        }

        if(column == -border){
            return min + 5*border -1 + row;
        }

        if(row == -border){
            return min + 3*border -1 - column;
        }

        return min + border -1 - row;
    }
}

calculate함수는 (row, column) 위치의 값을 찾습니다.

row와 column 중 절대값의 최대값을 찾아 몇번째 테두리인지 확인하고, 테두리의 최소값을 (2n-1)^2+1로 찾습니다.

(0, 0) 위치를 첫번째 테두리로 하기 때문에 2n-3이 아닌 2n-1를 최소값 계산에 사용하여야 합니다.

테두리의 우측 부분에 위치한 경우 최소값 + n -1 - row,

윗 부분에 위치한 경우 최소값 + 3n -1 - column,

좌측 부분에 위치한 경우 최소값 + 5n -1 - row,

아래 부분에 위치한 경우 최소값 + 7n -1 - column의 값으로 해당 위치 값이 결정됩니다.

문제를 풀때 주의하셔야 할 점은 출력 형식이 공백을 포함한 모든 숫자의 길이는 같아야 한다라는 것입니다.

공백을 얼마나 주어야 할지 알기 위해서는 최대값을 미리 기억해두었다가, 최대값의 문자열 길이를 구하여야 합니다.

해당 문자열의 길이 값으로 String.format의 형식화 문자열로 사용한다면 문제에서 요구하는 출력 형식을 맞출 수 있습니다.

'Coding Test > BOJ' 카테고리의 다른 글

[백준] 1929번 : 소수 구하기 (java)  (0) 2021.08.08
[백준] 1068번 : 트리 (java)  (0) 2021.07.23
[백준] 1051번 : 숫자 정사각형 (java)  (0) 2021.07.19