[백준 알고리즘] Node.js 1531. 투명

2023. 8. 10. 14:58코딩연습

1. 문제

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

 

1531번: 투명

첫째 줄에 N과 M이 주어진다. N은 0보다 크거나 같고, 50보다 작거나 같다. M은 0보다 크거나 같고, 50보다 작거나 같다. 둘째 줄부터 N개의 줄에 종이의 좌표가 주어진다. 왼쪽 아래 모서리의 x, y좌

www.acmicpc.net

 

2. 풀이

  • 100 * 100 크기의 그림을 가지고 있고, 1 * 1 크기의 종이로 모자이크 처리한다.
  • 불투명한 종이로 그림을 가리지만, M개 이하의 종이가 올려져 있으면 그 부분은 보이는 부분이다.
const inputs = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');

// 모자이크하는 N개의 종이와 보이게 되는 종이의 수 M
const [N,M] = inputs[0].split(" ").map(v => +v);

// 그림의 크기는 100 * 100 고정, 가려질 곳을 표시할 배열.
const picture = Array.from({length : 101}, () => Array(101).fill(0));

// 종이 N 번 만큼 반복
for(let i = 1; i <= N; i++){
	// N번의 줄에 좌표 설정.
    const [startX, startY, endX, endY] = inputs[i].split(" ").map(v => +v);
    
    // 해당 좌표에 가려지는 회수 표시.
    for(let j = startX; j <= endX; j++){
        for(let k = startY; k <= endY; k++){
            picture[j][k]++;
        }
    }
}


let answer = 0;

// 그림의 크기만큼 반복시키면서
for(let i = 1; i <= 100; i++){
    for(let j = 1; j <= 100; j++){
    	// 만약 해당 좌표의 숫자가 M 보다 크다면 answer 증가
        if(picture[i][j] > M) answer++;
    }
}

console.log(answer)

 

3. 정리

  • 문제를 이해하는데 시간이 걸렸다.
  • 종이를 겹쳐서 가린다고 생각했고, 겹친 부분이 M 보다 작다면 그 부분은 보이게 된다는 뜻이었고, 보이지 않게 되는 부분만을 카운트해주면 되는 간단한 문제였다.