티스토리 뷰
반응형
🧾 백준 2563번 색종이 문제 풀이 정리
📌 문제 설명
도화지 위에 크기가 10x10인 정사각형 색종이를 여러 장 붙입니다.
색종이들이 서로 겹칠 수 있으며, 도화지의 크기는 100x100입니다.
색종이를 모두 붙인 뒤, 도화지에서 검은색으로 칠해진 영역의 넓이를 구하는 문제입니다.
💡 색종이 한 장이 덮는 면적은 항상 100(=10×10)입니다.
하지만 색종이들이 겹칠 경우는 겹친 부분은 한 번만 세어야 합니다!
📥 입력 형식
- 첫 줄에 색종이의 수
k
(1 ≤ k ≤ 100)가 주어집니다. - 다음
k
줄에는 각 색종이의 왼쪽 아래 모서리 좌표(N, M)
이 주어집니다.0 ≤ N, M ≤ 90
- 색종이는 도화지의 경계를 벗어나지 않습니다.
🎯 목표
색종이들을 도화지 위에 붙였을 때, 겹치는 부분을 제외하고 색종이가 덮는 총 면적(=검은 영역의 넓이)을 구합니다.
💡 아이디어
✅ 1. 도화지 모델링
- 도화지를 100x100 크기의 2차원 배열로 생각합니다.
- 각 칸은 0 또는 1로 표시:
0
: 아직 색종이가 붙지 않은 칸1
: 색종이가 붙은 칸
✅ 2. 색종이 붙이기
- 각 색종이는 10x10 크기이므로, 입력으로 받은
(N, M)
좌표를 시작점으로 하여 - 세로
j
는N
부터N+10
, 가로i
는M
부터M+10
- 해당 범위에 해당하는
arr[j][i]
를 1로 바꿉니다.
✅ 3. 넓이 계산
- 2차원 배열
arr
를 전체 순회하면서 1로 되어 있는 칸의 개수를 모두 더하면, 겹침을 고려한 전체 넓이를 알 수 있습니다.
🧑💻 코드 설명
# 색종이 수 입력
k = int(input())
# 100x100 도화지 초기화 (모두 0으로)
arr = [[0 for _ in range(100)] for _ in range(100)]
# 색종이 정보 입력 및 도화지에 반영
for _ in range(k):
N, M = map(int, input().split())
for j in range(N, N + 10): # 세로 방향 (행)
for i in range(M, M + 10): # 가로 방향 (열)
arr[j][i] = 1 # 색종이 붙이기
# 색종이로 덮인 면적 계산
sum = 0
for i in range(100):
for j in range(100):
if arr[i][j] == 1:
sum += 1
print(sum) # 결과 출력
🔍 예제 입력/출력
✅ 입력
3
3 7
15 7
5 2
✅ 출력
260
🧠 설명
- 각각의 색종이는 100칸을 덮지만, 서로 겹칠 수 있습니다.
- 실제로 이 예제에서는 3개의 색종이가 일부 겹치기 때문에 300보다 작은
260
이 나옵니다.
🎓 쉬운 비유
도화지를 가로세로 1cm짜리 정사각형 타일로 만든 바닥이라고 생각해보세요.
색종이는 10cm x 10cm 매트입니다.
여러 개의 매트를 바닥에 올려두고, 위에서 보았을 때 매트가 깔린 전체 면적을 계산하는 것과 같습니다.
겹쳐서 깔린 부분은 중복 계산하면 안 됩니다!
✅ 마무리 정리
항목 | 내용 |
---|---|
핵심 아이디어 | 2차원 배열로 도화지를 모델링하여 색종이가 붙은 칸을 체크 |
시간 복잡도 | O(k × 100) → k는 최대 100개, 각 색종이 10x10 반복 |
공간 복잡도 | O(100×100) = 10,000 |
✍️ 결론
이 문제는 이차원 배열을 다루는 기초 문제로,
좌표를 기반으로 면적을 처리하는 사고 훈련에 좋습니다.
색종이를 일일이 붙이면서 겹침을 고려하고,
그 결과를 배열로 계산한다는 점에서 시뮬레이션 기법의 대표 예시라고 볼 수 있습니다.
✔️ 비슷한 문제를 더 연습하고 싶다면, 좌표 기반 시뮬레이션 문제를 검색해서 풀어보는 걸 추천합니다!
반응형
'백준 스터디' 카테고리의 다른 글
🎬 [백준 1436] 영화감독 숌 - "666"이 들어간 n번째 수 찾기 (Python 구현) (1) | 2025.06.02 |
---|---|
백준 1436번 영화감독 숌, C++ (0) | 2025.06.01 |
색종이 넓이 계산 백준 2563, C++ (0) | 2025.06.01 |
🧩 백준 1018번 - 체스판 다시 칠하기. 파이썬 (0) | 2025.05.30 |
백준 1018 체스판 다시 칠하기 C++ (1) | 2025.05.30 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 코딩 테스트
- 문자열처리
- 동적 계획법
- c언어
- 그리디
- C++ 알고리즘
- 파이썬코딩
- 알고리즘문제풀이
- 문제 풀이
- 그리디알고리즘
- 알고리즘 문제풀이
- DP
- C++
- 알고리즘기초
- 백준
- 브루트포스
- 파이썬
- Python
- 인접 행렬
- 객체지향
- 코딩테스트
- dfs
- 그래프 탐색
- c++알고리즘
- 알고리즘
- 프로그래밍
- 코딩
- 동적계획법
- 문제풀이
- python 알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
글 보관함
반응형