210123 | 백준 1531 | C++

1531

1531번 : 투명

📌 문제 이해

이 문제를 이해하려고 몇번을 읽었는지 모르겠다.. 정답률도 81%로 매우 높은데 왜이렇게 이해가 안됐는지.. 몇번을 읽다가 그림으로 그리니 바로 이해가 됐다! 그림판으로 그려봤다

먼저 첫번째 줄에 몇개의 종이로 가릴건지를 입력하고, 몇번 종이가 겹치면 모자이크가 되는지를 설정하는 숫자를 입력한다. 예시에서는 3 과 1을 입력했는데, 3개의 종이로 그림을 가리고, 종이가 같은 인덱스, 위치에 몇장 이하로 겹쳐지면 모자이크가 제대로 되지 않는지를 설정하는 것이다. 종이가 M 이상 겹쳐져야 완벽히 그림이 가려지는 것이다! 예시에서는 2장이상이 겹쳐져야 그림이 가려지는 것이다.


내가 그린 그림에서는 갈색부분이 두장이상 겹쳐진 부분으로, 저 부분의 칸 갯수를 결과값으로 출력 해야한다.

🎈 문제 풀이

for (int i = 0; i < N; i++) {
		cin >> x1 >> y1 >> x2 >> y2;
		for (int x = x1; x <= x2; x++) {
			for (int y = y1; y <= y2; y++)
				arr[x][y]++; // 입력된 좌표에 해당하는 인덱스에 모두 1씩 추가하기
		}
	}

N번만큼 좌표를 입력하도록 하고, 그 좌표 범위에 해당하는 인덱스에 1씩추가하여 나중에 M을 기준으로 판단하도록 설정한다.

for (int i = 1; i <= 100; i++) {
		for (int j = 1; j <= 100; j++) {
			if (arr[i][j] > M) // 입력한 M보다 크면 모자이크가 되었다는 뜻
				sum++;
		}
	}
cout << sum;

arr에 입력된 카운팅을 토대로 M보다 큰지를 판단하고, 만약 크다면 해당 인덱스에 모자이크가 되었다는 뜻이므로 sum에 그만큼 더해지도록하여 sum 값을 출력하면 된다.

#include <iostream>
using namespace std;

int main() {
	int N, M;
	cin >> N >> M;

	int x1, y1, x2, y2, sum = 0;
	int arr[101][101] = { 0, };

	for (int i = 0; i < N; i++) {
		cin >> x1 >> y1 >> x2 >> y2;
		for (int x = x1; x <= x2; x++) {
			for (int y = y1; y <= y2; y++)
				arr[x][y]++; // 입력된 좌표에 해당하는 인덱스에 모두 1씩 추가하기
		}
	}

	for (int i = 1; i <= 100; i++) {
		for (int j = 1; j <= 100; j++) {
			if (arr[i][j] > M) // 입력한 M보다 크면 모자이크가 되었다는 뜻
				sum++;
		}
	}
	cout << sum;

}

좋은 웹페이지 즐겨찾기