코딩 공부 연습

백준 2583 영역 구하기

miffy짱 2022. 12. 5. 15:41
반응형

정말 여러번 틀렸는데, 아쉬운점은 정렬을 확인 해볼 생각을 하지 않았다는 거였다. 정렬을 이상한 컬렉션을 이용해서 지금까지 정렬이 제대로 되고 있지 않던 거였는데, 다행히 해결했다.

 

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) {
        int m,n,k;
        int table[][] = new int[102][102];                  //0으로 초기화 되어있나?

        Scanner scanner = new Scanner(System.in);
        StringTokenizer stringTokenizer = new StringTokenizer(scanner.nextLine());
        Queue<Pair> q = new LinkedList();
        List <Integer> dir_x = List.of(1, 0, -1, 0);
        List <Integer> dir_y = List.of(0, 1, 0, -1);

        m = Integer.parseInt(stringTokenizer.nextToken());
        n = Integer.parseInt(stringTokenizer.nextToken());
        k = Integer.parseInt(stringTokenizer.nextToken());

        for (int i = 0; i < k; i++) {
            stringTokenizer = new StringTokenizer(scanner.nextLine());
            int x1 = Integer.parseInt(stringTokenizer.nextToken());
            int y1 = Integer.parseInt(stringTokenizer.nextToken());
            int x2 = Integer.parseInt(stringTokenizer.nextToken());
            int y2 = Integer.parseInt(stringTokenizer.nextToken());

            for (int garo = y1; garo < y2; garo++) {
                for (int sero = x1; sero < x2; sero++) {
                    table[garo][sero] = 1;
                }
            }
        }
        int cnt = 0;
        ArrayList<Integer> width = new ArrayList<>();

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (table[i][j] == 0) {
                    q.add(new Pair(i,j));
                    table[i][j] = 1;
                    int size_tmp = 0;
                    while (!q.isEmpty()) {
                        Pair cur = q.peek();
                        q.remove();
                        size_tmp++;
                        for (int dir = 0; dir < 4; dir++) {
                            int nx = cur.x + dir_x.get(dir);
                            int ny = cur.y + dir_y.get(dir);
                            if (nx < 0 || nx >= m || ny < 0 || ny >= n) continue;
                            if (table[nx][ny] == 1) continue;
                            table[nx][ny] = 1;
                            q.add(new Pair(nx, ny));
                        }
                    }
                    width.add(size_tmp);
                }
            }
        }
        Iterator iter = width.iterator();
        System.out.println(width.size());
        Collections.sort(width);
        int cur = 0;

        for (int i = 0; i < width.size(); i++) {
            System.out.print(width.get(i) + " ");
        }

        System.out.println();

    }

    public static class Pair {
        int x;
        int y;

        Pair(int x, int y){
            this.x = x;
            this.y = y;
        }
    }
}

 

width.stream().sorted();

 

이거로 정렬을 했었는데, 이걸로 하면 문제가 생기기 때문에 처음 넓이들을 저장하는 배열을 그냥 arrayList 를 이용하였고, 

 

Collections.sort(width);

collections.sort() 를 이용해 정렬했다.

 

Pair class 를 만들어 사용하였다.