백준 2563: 색종이 -Java

실버5

 

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

문제

가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다. 이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오.

 

예를 들어 흰색 도화지 위에 세 장의 검은색 색종이를 그림과 같은 모양으로 붙였다면 검은색 영역의 넓이는 260이 된다.

 

입력

첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리이고, 두 번째 자연수는 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리이다. 색종이의 수는 100 이하이며, 색종이가 도화지 밖으로 나가는 경우는 없다

 

출력

첫째 줄에 색종이가 붙은 검은 영역의 넓이를 출력한다.

 

예제 입력1

3

3 7

15 7

5 2

 

예제 출력1

260

 

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

public class Main {
	
    public static void main(String[] args) throws IOException {
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	int paperNum = Integer.parseInt(br.readLine());
    	
    	int[][] whitePaper = new int[100][100]; // 2차원 배열로 도화지 영역 선언
     			
    	// 한 행 씩 돌아가며 0으로 초기화
    	for (int[] row : whitePaper) {
        	Arrays.fill(row, 0); //Arrays.fill() 은 2차원 배열은 채우지 못하기 때문에 for 사용
    	}
    	
    	// 첫 줄 - 색종이 숫자만큼 반복
    	for (int i=0; i<paperNum; i++) {
    		StringTokenizer st = new StringTokenizer(br.readLine());
    		int a = Integer.parseInt(st.nextToken()); //색종이를 붙인 x 좌표
    		int b = Integer.parseInt(st.nextToken()); //색종이를 붙인 y 좌표
    		
    		// 색종이의 변 크기는 10 x 10으로 고정이므로 10번씩 반복
			// for 조건식에 시작 수를 각 좌표, 끝 수를 각 좌표 +10으로 설정
    		// 현재 수행되는 좌표의 위치에 1을 채운다.
    		for (int j=a; j<a+10; j++) {
    			for (int k=b; k<b+10; k++) {
    				whitePaper[j][k] = 1;
    			}
    		}
    	}
    	
    	//2차원 배열을 평면화 하여 모든 수의 값을 더하면 색종이가 겹쳐진 영역의 크기
    	int result = Arrays.stream(whitePaper)
    			.flatMapToInt(Arrays :: stream)
    			.sum();
    	
    	System.out.println(result);
    }
}

 

 

풀이

1. 가로 100, 세로 100 의 도화지를 2차원 int 배열로 표현한다.

2. 배열 내 모든 값을 0으로 초기화한다. -> Arrays.fill() 활용 (단, 해당 함수는 1차원 배열에만 가능)

3. 첫 줄에 입력받은 색종이의 수 만큼, 색종이 영역의 값을 모두 1로 변경하는 것을 반복한다.

4. 작업이 끝난 2차원 배열을 평면화하여 모든 값을 더한다. -> Arrays.stream() 활용

 

  -> 만약 1차원 배열을 모두 합하고 싶다면 Arrays.stram(arr).sum() 만 사용하면 된다.