백준 - 2563번: 색종이

Lee·2023년 3월 22일
0

알고리즘

목록 보기
4/34
post-thumbnail

문제 출처

문제 출처 : 2563번: 색종이

문제 이해하기

  • 가로, 세로의 크기가 각각 100인 정사각형 도화지 위에 가로, 세로가 각각 10인 정사각형 모양의 색종이를 붙인다.
  • 겹치는 부분이 있다면 겹치는 부분까지 고려해서 색종이 영역의 넓이를 구하면 되는 문제입니다.
  • 입력으로는 각 색종이를 놓는 시작점이 들어옵니다.

주요 조건 이해하기 ⭐️

  • 만약 색종이가 겹치지 않았다면, 색종이의 넓이를 구하고 갯수만큼 곱해주면 되는 문제지만, 겹치는 영역에 있다면 해당 부분을 제외해줘야합니다.

  • 맨 처음 이 문제를 접했을 때 겹치는 영역은 어떤 방식으로 구해줘야할까? 깊이 고민했습니다. 수학적으로 접근해야하는 문제라고 생각했지만, 문제의 카테고리는 2차원 배열이기 때문에 2차원 배열로 해결할 수 있는 방법을 선택했습니다.

  • 2차원 배열로 할 수 있는 방법을 생각하다보니 색종이의 넓이를 1칸씩 색칠할때마다 값을 1로 바꿔주고, 색칠하지 않은 영역에 대해선 0으로 초기화해주는 작업입니다.

1칸씩 색칠한다? 🧐

  • 문제에 나와있는 조건을 잘 읽어보면 정사각형의 흰 도화지는 가로, 세로가 각각 100입니다. 그 말은 이 정사각형의 넓이는 10000이고, 이를 2차원 배열로 만든다고 하면
    		2차원배열[][] 변수명 = new 2차원배열[100][100];
  • 위와 같은 방법으로 배열을 생성할 수 있습니다.
  • 이후 입력으로 주어진 색종이의 좌표에 x, y축 별로 10씩 더한 만큼 반복문을 돌려주면서 해당 색종이를 1개씩 색칠하는 방법입니다.
  • 이때 겹치는 부분이 있다면 해당 부분은 색칠하지 않는 코드를 작성해주시면 됩니다.

구현 스케치

for (int j = x; j < x + 10 ; j++) {
    for (int k = y; k < y + 10; k++) {
    	// 0인 곳은 아직 색칠하지 않은 곳, 1은 색칠한 곳
        if (square[j][k] == 0) {
            square[j][k] = 1;
            answer++;
            }
        }
   }

최종 소스 파일

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

public class BOJ_2563 {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());

		int[][] square = new int[101][101];
		int answer = 0;

		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());
			for (int j = x; j < x + 10 ; j++) {
				for (int k = y; k < y + 10; k++) {
					if (square[j][k] == 0) {
						square[j][k] = 1;
						answer++;
					}
				}
			}
		}

		System.out.println(answer);
	}

}

0개의 댓글