본문 바로가기

java

백준 2563번 문제 색종이(Java_자바)

 

 

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

 

2563번: 색종이

가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록

www.acmicpc.net

 

 

2563번 색종이 문제
2563번 색종이 입력/출력

 

문제를 해석해보자!

수학적인 사고가 필요할꺼 같지만

문제 자체는 단순히 주어진 색종이들이 붙여진 종이에서

실제로 색종이가 붙은 부분의 넓이를 계산하는것이다.

 

정리해보자!


 

int[][] paper = new int[100][100]; // 종이 표시 배열

int n = scanner.nextInt();  // 색종이의 개수

 

문제에서 제시한

가로, 세로 크기 100 x 100

흰 색 도화지

행렬 100 인 배열을 만들어주자!

 

그리고

문제 입력 시 색종이의 개수를 담아줄 변수를 만들자! 

 


static void markPaper(int[][] paper, int x, int y) {
    for (int i = x; i < x + 10; i++) {
        for (int j = y; j < y + 10; j++) {
            paper[i][j] = 1;
        }
    }
}

 

 

흰 도화지 (배열) 위에

가로, 세로 크기 10 x 10 색종이를 채워 넣어주는

markPaper 이라는 함수에 정의해보자!

markPaper > '각 색종이가 붙은 부분 ' 은 흰 도화지(배열)1로 표시

 

TMI 이긴한데

'static' 을 사용하는 이유는

메서드나 변수는 특정한 객체의 인스턴스에 속하는 것이 아니라

클래스 자체에 속하게 되어

예를 들어 Main이라는 클래스 안이라고 치면

클래스 자체에 속하게 되어 클래스의 모든 인스턴스에서 공유한다!

 

더 쉽게 이야기하면 해당 메서드를 클래스 이름으로 직접 호출 가능!!

 

 

출력해보자!

 

흰 도화지에 각 색종이 1로 표시 출력

 


 

색종이가 붙은 부분의 넓이를 계산하기 위해 calculateArea 함수를 정의해보자!

static int calculateArea(int[][] paper) {
    int area = 0;
    for (int i = 0; i < 100; i++) {
        for (int j = 0; j < 100; j++) {
            if (paper[i][j] == 1) {
                area++;
            }
        }
    }
    return area;
}

 

1이 존재 할 경우 'area++' 라는 조건식을 추가해주자!

그리고 1이 누적되어 있는 area 를 리턴해주자!


 

이제 합쳐보자!

 

Scanner

mport java.util.Scanner;

public class ColorPaper_2563 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[][] paper = new int[100][100];

        int n = scanner.nextInt();

        // 각 색종이의 위치를 입력받아 배열에 표시
        for (int i = 0; i < n; i++) {
            int x = scanner.nextInt();
            int y = scanner.nextInt();
            markPaper(paper, x, y);
        }

        // 색종이가 붙은 부분의 넓이 계산
        int area = calculateArea(paper);
        System.out.println(area);
    }

    // 색종이가 붙은 부분을 1로 표시
    static void markPaper(int[][] paper, int x, int y) {
        for (int i = x; i < x + 10; i++) {
            for (int j = y; j < y + 10; j++) {
                paper[i][j] = 1;
            }
        }
    }

    // 색종이가 붙은 부분의 넓이를 계산
    static int calculateArea(int[][] paper) {
        int area = 0;
        for (int i = 0; i < 100; i++) {
            for (int j = 0; j < 100; j++) {
                if (paper[i][j] == 1) {
                    area++;
                }
            }
        }
        return area;
    }

}

 

결과! 성공!!

 

성공!!!

입력 / 출력

 

 

 

정상 출력 확인!!

다른 방식으로도 해보자!

 


 

BufferedReader

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

public class ColorPaper_2563 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int[][] paper = new int[100][100]; 

        int n = Integer.parseInt(br.readLine()); 

        for (int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
            markPaper(paper, x, y);
        }

        
        int area = calculateArea(paper);
        System.out.println(area);
    }

    static void markPaper(int[][] paper, int x, int y) {
        for (int i = x; i < x + 10; i++) {
            for (int j = y; j < y + 10; j++) {
                paper[i][j] = 1;
            }
        }
    }

    static int calculateArea(int[][] paper) {
        int area = 0;
        for (int i = 0; i < 100; i++) {
            for (int j = 0; j < 100; j++) {
                if (paper[i][j] == 1) {
                    area++;
                }
            }
        }
        return area;
    }

}

결과! 성공!


 

힘내자!!