1. 문제 정보
- 문제 번호: 2563번
- 문제 이름: 색종이
- 사용 언어: Python
- 문제 링크: 백준 2563번 바로가기
2. 접근 방법 (알고리즘)
100X100 크기의 도화지에 10x10 크기의 색종이를 여러 장 붙인 후, 색종이가 붙은 영역의 총넓이를 구하는 문제입니다.
수학적으로 겹치는 넓이를 빼고 계산하려면 매우 복잡해집니다.
=> 대신 도화지를 2차원 배열로 만들고, 색종이가 붙은 부분을 1로 채우는 방식을 사용하면 쉽게 해결할 수 있습니다.
- 100x100 크기의 0으로 채워진 2차원 리스트(canvas)를 만듭니다.
- 입력받은 좌표 (x, y)부터 가로 10칸, 세로 10칸을 순회하며 값을 1로 바꿉니다.
- 이미 1인 곳에 또 색종이가 올라와도 그대로 1로 덮어쓰기 때문에 중복 처리를 따로 할 필요가 없습니다.
- 마지막에 canvas에 있는 모든 1의 개수를 세면 넓이가 됩니다.
3. 코드 구현 (Python)
# 1. 도화지 초기화 (100x100 2차원 리스트)
canvas = [[0] * 100 for _ in range(100)]
# 2. 색종이 수 입력
n = int(input())
# 3. 색종이 붙이기
for _ in range(n):
# 왼쪽 변 사이의 거리(x), 아래쪽 변 사이의 거리(y)
x, y = map(int, input().split())
# 해당 좌표부터 10x10 영역을 1로 채움
for i in range(x, x + 10):
for j in range(y, y + 10):
canvas[i][j] = 1
# 4. 전체 1의 개수 출력 (넓이)
result = 0
for row in canvas:
result += sum(row)
print(result)
4. 배운 점 & 회고 (TIL)
이번 문제를 풀면서 파이썬의 리스트 처리와 2차원 배열의 개념을 확실히 잡을 수 있었다. (파이썬이 너무 오랜만이라 다 까먹었다..)
A. 2차원 리스트 순회: for check in canvas의 의미
canvas는 리스트 안에 리스트가 있는 형태다.
- for check in canvas: 라고 하면 "한 줄(리스트)"을 통째로 꺼내온다.
- 하나의 원소(칸)에 접근하려면 중첩 반복문을 써야 한다.
for check in canvas: # 한 줄씩 꺼냄 ([0, 1, 0]...)
for cell in check: # 그 줄 안의 원소 하나씩 꺼냄 (0, 1, 0...)
print(cell)
물론 canvas[row][col] 처럼 인덱스로 직접 접근할 수도 있다.
B. 파이썬 기초 문법 정리
- 입력 처리: input()은 문자열이므로 숫자는 int() 변환이 필수다. 여러 숫자는 map(int, input().split())을 사용한다.
- 리스트 내포(List Comprehension): 2차원 배열을 만들 때 매우 유용하다.
- [[0]*100 for _ in range(100)] → 100x100 격자 생성
- 들여쓰기: 파이썬은 {} 대신 들여쓰기로 블록을 구분하므로 탭/공백 관리가 생명이다.
C. 좌표 다루기 (직관 vs 프로그래밍)
가장 헷갈렸던 부분이다. 사람처럼 "왼쪽 아래, 오른쪽 위"로 생각하면 구현이 어렵다.
- 도화지 = 격자(점들의 집합)으로 봐야 한다.
- canvas[y][x] 혹은 canvas[row][col] 형태로 행과 열을 매핑해서 단순화하는 것이 핵심이다.
- 겹치는 부분은 그냥 1로 덮어쓰면(Overwrite) 별도의 중복 제거 로직이 필요 없다.
D. 주의할 점
- count 만큼 입력을 받지 않으면 EOFError가 발생할 수 있다.
- 좌표계 순서(x, y vs row, col)를 혼동하지 말자.
'알고리즘 문제풀이 > 파이썬' 카테고리의 다른 글
| [백준/Python] 4153번: 직각삼각형 - 정렬(sorted)과 내장 함수의 중요성 (0) | 2026.01.28 |
|---|