📍 색종이

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

 

 

 

두 번째 테스트케이스

 

0 2 10 10 은 차례대로 색종이의 맨 왼쪽 아래 x, y좌표, 너비, 높이이다.

따라서 색종이의 네 좌표는 아래 왼쪽 -> 아래 오른쪽 -> 위 오른쪽 -> 위 왼쪽 순서대로

(0, 2), (10, 2), (10, 12), (0, 12)이고,

이는 (0, 2), (0+10, 2), (0+10, 2+10), (0, 2+10)이다.

 

 

 

해야할 것은 총 3가지이다.

1. 면적 입력받기

2. 번호 표시하기

3. 번호 세기

 

 

 

1. 면적 입력받기

 

int startX = Integer.parseInt(st.nextToken());
int startY = Integer.parseInt(st.nextToken());
int endX = startX + Integer.parseInt(st.nextToken());
int endY = startY + Integer.parseInt(st.nextToken());

 

 

 

2. 번호 표시하기

for(int x=startX; x<=endX; x++){
    for(int y=startY; y<=endY; y++){
        array[x][y] = i;
    }
}

 

 

 

3. 번호 세기

색종이의 면적을 인덱스에 맞게 저장하기 위해 배열 cntArray의 크기는 색종이의 수+1 이다.

int[] cntArray = new int[N+1];
for(int i=0; i<array.length; i++){
    for(int j=0; j<array[i].length; j++){
        cntArray[array[i][j]] += 1;
    }
}

 

 

 

✨ 전체코드 ✨

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

public class Main {

    static int N;
    static int[][] array;
    static StringBuilder sb = new StringBuilder();

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

        array = new int[1001][1001];

        for (int i = 1; i <= N; i++) {

            // 1. 면적 입력받기
            st = new StringTokenizer(sc.readLine());
            int startX = Integer.parseInt(st.nextToken());
            int startY = Integer.parseInt(st.nextToken());
            int endX = startX + Integer.parseInt(st.nextToken());
            int endY = startY + Integer.parseInt(st.nextToken());

            // 2. 번호 표시하기
            PaintNumber(i, startX, startY, endX, endY);
        }

        // 3. 번호 세기
        CountNumber();
        System.out.println(sb);
    }


    // 2.
    private static void PaintNumber(int i, int startX, int startY, int endX, int endY) {
        for (int x = startX; x < endX; x++) {
            for (int y = startY; y < endY; y++) {
                array[x][y] = i;
            }
        }
    }


    // 3.
    private static void CountNumber() {
        int[] cntArray = new int[N + 1];
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                if (array[i][j] > 0) {
                    cntArray[array[i][j]]++;
                }
            }
        }

        for (int i = 1; i <= N; i++) {
            sb.append(cntArray[i]).append("\n");
        }
    }
}

 

 

 

🌀 성능

  • 메모리 : 18,940 KB
  • 시간 : 168 ms

 


처음엔 main 함수에 다 때려박았다가 나중에 기능마다 함수로 따로 빼서 구현했더니

메모리와 시간 성능이 거의 2배나 줄었다. ㄷㄷ