글 작성자: 취업중인 피터팬
728x90

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

 

2563번: 색종이

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

www.acmicpc.net

문제 설명

 

크기가 10*10=100인 색종이의 크기를 구하는 문제입니다, 단 겹치는 부분까지 계산해야 합니다.

 

문제 풀이

해당 문제를 생각보다 많이 고민했습니다. 겹치는 부분을 찾아서 그부분을 빼주면 될거라고 생각하고 코드를 짜봤는데 너무 복잡해졌습니다. 그래서 좌표가 100 이하라는 사실에 집중해서 해당 좌표를 2차원 배열 0으로 선언하고 출발점 좌표부터 10*10만큼 해당 좌표를 모두 1로 만들어 더해주면 넓이가 나오지 않을까? 라고 다시 생각하고 코드를 짰습니다.

 

import java.util.*;

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


        int paperCount = sc.nextInt();//색종이 개수
        int area = 0;//넓이
        int x; //x좌표
        int y; //y좌표

        int[][] coordinate = new int[100][100];

        for(int i = 0; i < paperCount; i++){
            x = sc.nextInt();//x값
            y = sc.nextInt();//y값
			
            //넓이에 해당되는 모든 좌표는 1로 만듭니다.
            for(int j=x; j<x+10; j++) {
                for(int z=y; z<y+10; z++) {
                    coordinate[j][z] = 1;
                    //System.out.println("x : " + j + " y : " + z);
                }
            }

        }
        
        //2차원 배열을 돌려서 1일경우 넓이를 더해줍니다.
        for(int i =0; i<coordinate.length; i++){
            for(int j=0; j<coordinate[i].length; j++){
                if(coordinate[i][j] == 1){
                    //ystem.out.println("x : " + i + " y : " + j);
                    area += 1;
                }
            }
        }
		
        //정답 출력
        System.out.println(area);
    }
}

 

해당 x,y값을 받고 for문을 돌릴면서 해당 넓이의 좌표를 1로 변경할때 최대값을 j<=x+10으로 하지않고 j<x+10 으로 하시는지 궁금하실 수 있습니다.

 

위에 그림처럼 좌표수와 길이가 다릅니다. 즉 넓이를 구하는 문제에서는 모든 좌표가 아니라 마지막 좌표 혹은 처음 좌표를 빼준 값을 제외해 주어야 합니다.

위에 그림처럼 마지막 줄을 제외하더라도 넓이를 구하는데는 크게 상관이 없습니다. 겹치더라도 첫줄의 좌표는 채워지니깐요.