[백준] 2563번 - 색종이 (Java)

Jina·2023년 8월 11일
0

Java

목록 보기
13/13

문제


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

이 문제의 키포인트는 겹치는 부분을 제외하는 것!

각 색종이의 면적에서 겹치는 부분을 빼려고 삽질을 하다가... 생각해보니 색종이 2개만 겹칠 수 있는 게 아니라, 전부 겹칠 수도 있고, 각 색종이 면적이 1*1도아니고 10*10이라 너무 복잡했다.

도저히 안 풀려서 결국 검색... 😢
최대한 코드는 안 보고 힌트만 얻기 위해, 참고 블로그글의 키워드만 슈루룩 봤더니 boolean 값을 사용했다는 것이 눈에 띄었다.

왜 이 생각을 못 했을까^^ 겹치는 부분을 손쉽게 처리할 수 있는 방법임을 깨닫고 다시 풀이를 작성해보았다.

💡 풀이


드디어 맞았다

도화지가 100*100 크기이므로 [101][101] 크기의 boolean 배열을 만들고,
각 색종이는 10*10 크기이므로 입력받은 위치 +10까지를 true가 되게 했다.

이후 true인 부분만 count해주면 면적 계산이 손쉽게 끝난다. 하하...

public class Main {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader( new InputStreamReader(System.in));

        boolean Area[][] = new boolean [101][101]; // 도화지 (기본 false)
        int N = Integer.parseInt(br.readLine());    // 색종이의 수
        int x, y;   // 색종이의 위치
        int area = 0;    // 색종이가 있는 면적

        String input;
        for(int i=0; i<N; i++) {

            // 색종이의 위치 입력받기
            input = br.readLine();
            x = Integer.parseInt(input.split(" ")[0]);
            y = Integer.parseInt(input.split(" ")[1]);

            // 해당 위치+10까지 true로 변경
            for(int j = x; j < x+10; j++) {
                for(int k= y; k < y+10; k++) {
                    Area[j][k] = true;
                }
            }
        }

        // true인 점 카운트
        for(int i=0; i <= 100; i++){
            for(int j=0; j <= 100; j++){

                if(Area[i][j] == true)
                    area++;
            }
        }

        // 출력
        System.out.println(area);

    }
}

💡 개선


두 반복문을 합쳐서 처리할 수 있었다.

이전 풀이

원래는 중첩된 반복문을 2번 사용했다.

  1. 색종이의 위치마다 true로 변경하는 이중반복문 1개
  2. true인 점을 카운트 하는 이중반복문 1개

1번 반복문에서 이미 true인 경우를 처리하지 않아서 해당 반복문에서 area를 +1하면 겹치는 부분에서 중복 카운트되기 때문이었다.

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

            // 색종이의 위치 입력받기
            (생략)

            // 해당 위치+10까지 true로 변경
            for(int j = x; j < x+10; j++) {
                for(int k= y; k < y+10; k++) {
                    Area[j][k] = true;
                }
            }
        }

        // true인 점 카운트
        for(int i=0; i <= 100; i++){
            for(int j=0; j <= 100; j++){

                if(Area[i][j] == true)
                    area++;
            }
        }

개선 후 풀이

하지만 true인 경우를 제외하는 if문을 추가하면, 바로 area를 +1 해줄 수 있었다!
조금 더 깔끔해졌다~

        for(int i=0; i<N; i++) {
        
            // 색종이의 위치 입력받기
            (생략)
            
            // 해당 위치+10까지 true로 변경
            for(int j = x; j < x+10; j++) {
                for(int k= y; k < y+10; k++) {

                    if(Area[j][k] == false){
                        Area[j][k] = true;
                        area ++;
                    }

                }
            }
        }

0개의 댓글

관련 채용 정보