알고리즘 문제풀이/파이썬

[백준/Python] 2563번: 색종이 - 2차원 배열과 좌표 정복하기

aerimi-code 2026. 1. 22. 20:51

1. 문제 정보


2. 접근 방법 (알고리즘)

100X100 크기의 도화지에 10x10 크기의 색종이를 여러 장 붙인 후, 색종이가 붙은 영역의 총넓이를 구하는 문제입니다. 
수학적으로 겹치는 넓이를 빼고 계산하려면 매우 복잡해집니다. 

 

=> 대신 도화지를 2차원 배열로 만들고, 색종이가 붙은 부분을 1로 채우는 방식을 사용하면 쉽게 해결할 수 있습니다.

 

 

  1. 100x100 크기의 0으로 채워진 2차원 리스트(canvas)를 만듭니다.
  2. 입력받은 좌표 (x, y)부터 가로 10칸, 세로 10칸을 순회하며 값을 1로 바꿉니다.
  3. 이미 1인 곳에 또 색종이가 올라와도 그대로 1로 덮어쓰기 때문에 중복 처리를 따로 할 필요가 없습니다.
  4. 마지막에 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. 파이썬 기초 문법 정리

  1. 입력 처리: input()은 문자열이므로 숫자는 int() 변환이 필수다. 여러 숫자는 map(int, input().split())을 사용한다.
  2. 리스트 내포(List Comprehension): 2차원 배열을 만들 때 매우 유용하다.
    • [[0]*100 for _ in range(100)] → 100x100 격자 생성
  3. 들여쓰기: 파이썬은 {} 대신 들여쓰기로 블록을 구분하므로 탭/공백 관리가 생명이다.

C. 좌표 다루기 (직관 vs 프로그래밍)

가장 헷갈렸던 부분이다. 사람처럼 "왼쪽 아래, 오른쪽 위"로 생각하면 구현이 어렵다.

  • 도화지 = 격자(점들의 집합)으로 봐야 한다.
  • canvas[y][x] 혹은 canvas[row][col] 형태로 행과 열을 매핑해서 단순화하는 것이 핵심이다.
  • 겹치는 부분은 그냥 1로 덮어쓰면(Overwrite) 별도의 중복 제거 로직이 필요 없다.

D. 주의할 점

  • count 만큼 입력을 받지 않으면 EOFError가 발생할 수 있다.
  • 좌표계 순서(x, y vs row, col)를 혼동하지 말자.