[프로그래머스] 바탕화면 정리 풀이

2025. 8. 25. 13:02프로그래머스 코테 연습

728x90

TIL (Today I Learned) - 코딩테스트 디버깅 경험

📅 날짜

2025년 8월 25일

🎯 주제

프로그래머스 "바탕화면 정리" 문제 해결 과정에서 배운 것들


🚨 문제 상황

프로그래머스의 "바탕화면 정리" 문제를 풀면서 20개 테스트케이스 중 4개가 계속 틀렸다. 코드 로직은 분명히 맞는 것 같은데 왜 틀렸을까?

def solution(wallpaper):
    answer = []
    n = len(wallpaper)
    maps = []
    for i in range(n):
        m = list(wallpaper[i])
        maps.append(m)
    minX = len(maps[0])  # 🚨 여기가 문제!
    minY = len(maps)     # 🚨 여기도 문제!
    maxX = -1
    maxY = -1
    # ... 나머지 코드

🔍 문제 분석

처음엔 다양한 반례를 생각해봤다:

  • 파일이 없는 경우 → 문제에서 "적어도 하나의 파일이 있다"고 명시됨
  • 경계값 처리 문제 → 로직상 문제없어 보임
  • 좌표 순서 혼동 → 이것도 맞는 것 같은데...

하지만 진짜 문제는 변수 초기화에 있었다!

💡 깨달은 것

1. 변수명과 실제 의미의 불일치

# 잘못된 초기화
minX = len(maps[0])  # X는 행(세로)인데 열 개수로 초기화
minY = len(maps)     # Y는 열(가로)인데 행 개수로 초기화

# 올바른 초기화
minX = len(maps)     # 행 개수로 초기화 (세로 좌표의 최댓값)
minY = len(maps[0])  # 열 개수로 초기화 (가로 좌표의 최댓값)

2. 좌표계에 대한 명확한 이해

문제에서 좌표는 (세로 좌표, 가로 좌표) 형태였다:

  • X좌표 = 세로 좌표 = 행 인덱스
  • Y좌표 = 가로 좌표 = 열 인덱스

이 기본 개념을 헷갈려서 초기화를 잘못했다.

🎓 배운 교훈

1. 변수명의 중요성

minX, minY 같은 변수명을 사용할 때는 X, Y가 정확히 무엇을 의미하는지 명확히 해야 한다. 더 명확한 이름을 사용하는 게 좋겠다:

min_row = len(maps)     # 더 명확함
min_col = len(maps[0])  # 더 명확함

2. 초기값 설정의 중요성

min 값을 찾을 때는 충분히 큰 값으로, max 값을 찾을 때는 충분히 작은 값으로 초기화해야 한다. 하지만 논리적으로 맞는 값으로 초기화해야 한다는 점이 핵심이다.

3. 디버깅 시 의심해볼 포인트들

  • 경계값 처리
  • 초기화 값
  • 좌표계 이해
  • 변수명과 실제 의미의 일치성

🔧 수정된 코드

def solution(wallpaper):
    answer = []
    n = len(wallpaper)
    maps = []
    for i in range(n):
        m = list(wallpaper[i])
        maps.append(m)

    min_row = len(maps)      # 올바른 초기화
    min_col = len(maps[0])   # 올바른 초기화
    max_row = -1
    max_col = -1

    for row in range(len(maps)):
        for col in range(len(maps[0])):
            if maps[row][col] == '#':
                max_row = max(max_row, row)
                min_row = min(min_row, row)
                max_col = max(max_col, col)
                min_col = min(min_col, col)

    answer.extend([min_row, min_col, max_row + 1, max_col + 1])
    return answer

🎯 결론

간단해 보이는 실수가 가장 찾기 어려운 버그가 될 수 있다. 특히 변수 초기화나 좌표계 이해 같은 기본적인 부분에서 실수가 나면, 로직이 아무리 완벽해도 일부 테스트케이스에서 실패할 수 있다.

앞으로는 변수명과 의미의 일치성, 올바른 초기화에 더 신경써야겠다.

 

728x90