본문 바로가기
백준 문제 풀이/2차원 배열

(#2563 Java) 색종이

by _비니_ 2024. 2. 24.

 

 

문제 이해

 

문제를 이해하는 것은 쉬웠다. 

첫 줄에 색종이의 개수가 입력되고, 색종이의 넓이는 100으로 정해져있기 때문에,

(색종이의 개수 * 100) - 겹치는 부분 으로 구하면 될 것이라고 생각했다. 

그럼 중복된 부분의 넓이를 어떻게 구하면 될까?

 

2차원 배열을 boolean 타입으로 만들어준 후, 이미 체크가 된 부분이면 중복된 부분이라고 생각하면 된다.

그럼 차근차근 코드를 작성해보자.

 

문제 해결

 

우선 첫 번째 줄에 입력되는 색종이 개수를 입력받은 후 변수에 저장해준다.

Scanner in = new Scanner(System.in);
int paperCount = in.nextInt(); //색종이 개수

 

 

그 이후 입력받을 x,y좌표에 해당하는 변수와, 중복되는 부분을 저장해줄 변수를 선언하고 초기화해준다.

또한 위에서 언급했던 것처럼 2차원 배열을 boolean 타입으로 만들어준다. (흰색 도화지는 가로, 세로 각각 100, 100)

int x = 0;
int y = 0;
int duplicateArea = 0;

boolean[][] paper = new boolean[100][100];

 

 

전체 반복문은 색종이의 개수만큼 반복해주면 되고, 그 반복문 안에서는 각각 입력받은 x, y좌표에서 10을 더한만큼 반복해주면 된다. (색종이의 가로, 세로는 각각 10이므로)

만약 paper[j][k]가 false이면, 아직 체크되지 않았다고 보며, 이를 true로 만들어준다.

그럼 true는 이미 체크가 된 상태를 의미한다. 즉 true일 경우, 이를 중복된 부분이라고 보며, duplicateArea를 증가시킨다.

for(int i = 0; i < paperCount; i++) {
    x = in.nextInt();
    y = in.nextInt();

    for (int j = x; j < x+10; j++) {
        for (int k = y; k < y+10; k++) {
            if(paper[j][k]) { // 이미 ture이면
                duplicateArea++; //중복되는 부분 넓이 증가
            } else {
                paper[j][k] = true; //중복되지 않으면, 해당 부분을 true로 체크해두기.
            }
        }
    }
}

 

 

색종이 개수만큼 반복이 왼료됐다면, duplicateArea 변수에는 총 중복된 부분의 넓이가 저장되어있을 것이다.

즉 색종이 개수 (paperCount)에서100을 곱한 후, 중복된 부분의 넓이를 빼주면 끝이다~!

int totalArea = paperCount * 100 - duplicateArea;
System.out.println(totalArea);

 

 

최종 코드

 

import java.util.Scanner;
public class ColoredPaper {

    // (100 x 색종이 개수) - 중복 되는 부분
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int paperCount = in.nextInt(); //색종이 개수

        int x = 0;
        int y = 0;
        int duplicateArea = 0;

        boolean[][] paper = new boolean[100][100];

        for(int i = 0; i < paperCount; i++) {
            x = in.nextInt();
            y = in.nextInt();

            for (int j = x; j < x+10; j++) {
                for (int k = y; k < y+10; k++) {
                    if(paper[j][k]) { // 이미 ture이면
                        duplicateArea++; //중복되는 부분 넓이 증가
                    } else {
                        paper[j][k] = true; //중복되지 않으면, 해당 부분을 true로 체크해두기.
                    }
                }
            }
        }

        int totalArea = paperCount * 100 - duplicateArea;
        System.out.println(totalArea);
    }
}

반응형

'백준 문제 풀이 > 2차원 배열' 카테고리의 다른 글

(#10798 Java) 세로읽기  (0) 2024.02.24
(#2566 Java) 최댓값  (0) 2024.02.23
(#2738 Java) 행렬 덧셈  (1) 2024.02.23