728x90
반응형
SMALL
백준 문제 풀이: 10163 [색종이]
문제 링크: https://www.acmicpc.net/problem/10163
문제 설명:
가로세로 1001×1001 크기의 도화지에 N장의 색종이를 순서대로 붙였을 때, 마지막에 보이는 각 색종이의 면적(보이는 칸 수)을 구하는 문제입니다.
각 색종이는 좌측 하단 좌표와 너비, 높이로 주어지며, 나중에 붙인 색종이가 앞의 색종이를 덮을 수 있습니다.
문제 해결 코드
#include <iostream>
using namespace std;
int arr[1001][1001];
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int n;
cin >> n;
// 각 색종이 정보를 받아서 해당 위치에 색종이 번호를 기록
for (int i = 1; i <= n; i++) {
int a, b, c, d;
cin >> a >> b >> c >> d;
for (int j = a; j < a + c; j++) {
for (int h = b; h < b + d; h++) {
arr[j][h] = i;
}
}
}
// 각 색종이 번호가 도화지 위에 몇 칸 있는지 세기
for (int i = 1; i <= n; i++) {
int cnt = 0;
for (int j = 0; j <= 1000; j++) {
for (int h = 0; h <= 1000; h++) {
if (arr[j][h] == i) {
cnt++;
}
}
}
cout << cnt << '\n';
}
}
코드 설명
- 핵심 알고리즘: 2차원 시뮬레이션 – 도화지를 1001×1001 격자로 보고, 색종이 번호로 덮어쓰기
- 구현 세부사항:
arr[1001][1001]
: 도화지의 각 위치에 마지막으로 덮인 색종이 번호 저장- 입력받은 좌표와 크기만큼 도화지에 색종이 번호로 덮기
- 1번부터 n번까지의 색종이에 대해 도화지를 순회하며 자신의 번호가 있는 칸의 수를 카운트
- 시간 복잡도 분석:
- 색종이 배치: O(n ⋅ w ⋅ h), 최악의 경우 O(n ⋅ 1000 ⋅ 1000)
- 출력 계산: O(n ⋅ 1001²)
- 1001×1001 도화지 순회는 허용 가능한 수준
결과
예시 입력:
3
3 2 5 3
15 7 4 4
5 2 3 3
예시 출력:
6
16
9
세 번째 색종이가 일부 첫 번째 색종이를 덮었기 때문에 1번과 3번 색종이 면적이 감소합니다.
다른 접근 방식이나 최적화 아이디어가 있다면 댓글로 함께 나눠주세요!
728x90
반응형
LIST
'BAEKJOON > 구현' 카테고리의 다른 글
백준 11094번 [꿍 가라사대](C++) -yes6686- 티스토리 (2) | 2025.06.05 |
---|---|
백준 12760번 [최후의 승자는 누구?](C++) -yes6686- 티스토리 (0) | 2025.06.04 |
백준 32369번 [양파 실험](C++) -yes6686- 티스토리 (0) | 2025.03.30 |
백준 20006번 [랭킹전 대기열](C++) -yes6686- 티스토리 (0) | 2025.02.23 |
백준 3758번 [KCPC](C++) -yes6686- 티스토리 (1) | 2025.02.15 |