전개발
article thumbnail
Published 2023. 1. 12. 22:26
[Java] 백준 #2563 : 색종이 Algorithm

문제분류

구현

문제

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

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

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

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

예제 입력 1

3
3 7
15 7
5 2

예제 출력 1

260

Solution

  • 도화지의 가로,세로 최대는 100씩이므로, int[100][100] 배열을 만듭니다.
  • input을 받으면서, 해당하는 구간을 모두 1로 할당합니다. (겹치는 구간은 이미 1로 할당되어 있으므로, 고려할 필요가 없어집니다.)
  • 도화지 최대 범위가 100이므로, 각 for문에 break;가 되는 조건을 달아줍니다. (if (k > 100) break;, if (j > 100) break;)
  • 전체 배열(papers)을 돌면서, 요소가 1인 부분을 모두 더해줍니다.(sum) (sum == 검은 영역의 넓이)

코드

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);

        int[][] papers = new int[100][100];
        int tc = sc.nextInt();
        int sum = 0;

        for (int i = 0 ; i < tc; i ++) {
            int x = sc.nextInt();
            int y = sc.nextInt();

            for (int j = x; j < x +10; j++) {
                for (int k = y; k < y + 10; k++) {
                    papers[j][k] = 1;
                    if (k > 100) break;
                } 
                if (j > 100) break;
            }
        }

        for (int j = 0 ; j < 100; j++) {
            for (int k =0; k < 100; k++) {
                if (papers[j][k] == 1) sum +=1;
            }
        }
        System.out.println(sum);
    }
}

느낀 점

알고리즘 동아리에서 접했던 문제인데, 어떻게 접근해야할지 몰라서 당시에 많이 헤맸던 문제입니다.
SSAFY에 입과하면서 당시에 해결하지 못했던 문제를 첫 문제로 풀어라 했어서 많이 당황했습니다.

처음엔 if 조건을 달아서 겹치는 부분을 해결해려했으나, 색종이가 2개씩, 3개씩 겹치는 경우가 많아서 if 조건으로는 해결하기 어려웠습니다. 옆 자리 SSAFY 동기가 2차원 배열로 접근해보라는 힌트를 주어서 겨우 해결할 수 있었습니다. (👍👍)


어떤 문제든 상황이든 많이 접해보고 상황에 맞는 해결책을 바로바로 찾을 수 있는 능력이 실력이란 것을 느끼게 해준 문제였습니다.
앞으로 다양한 문제를 많이 경험하면서 적당한 알고리즘이나 풀이 과정을 선정할 수 있어야겠다고 생각했습니다.

profile

전개발

@전개발

프론트엔드 개발자, 전인혁(Jeonny) 입니다.
포스팅이 좋았다면 "공감❤️" 과 "댓글👍🏻" 부탁드립니다. 😊