반응형
edit_note 오늘 코테 문제
| 문제 | 바탕화면 정리 (Lv.1) |
| 플랫폼 | 프로그래머스 |
| 난이도 | Lv. 1 |
| 핵심 요구사항 | 모든 '#'을 포함하는 가장 작은 직사각형의 좌상단·우하단 좌표 구하기 |
내가 작성한 코드
python
def solution(wallpaper):
min_val = float('inf')
max_val = float('-inf')
position = []
lux = min_val
luy = min_val
rdx = max_val
rdy = max_val
for row, line in enumerate(wallpaper):
for col, char in enumerate(line):
if char == '#':
position.append((row, col))
for (row, col) in position:
lux = min(lux, row)
luy = min(luy, col)
rdx = max(rdx, row)
rdy = max(rdy, col)
return (lux, luy, rdx+1, rdy+1)
풀이 접근법
핵심은 파일 칸의 "인덱스"와 드래그 좌표인 "격자점"이 한 칸 어긋나 있다는 점이다. 칸 인덱스 기준으로 min/max를 구한 뒤, 오른쪽 아래 경계만 +1 해주면 칸 전체를 포함하는 직사각형이 된다.
1
파일 위치 전부 찾기
이중 for문(enumerate)으로 wallpaper를 순회하면서 '#'인 칸의 (row, col)을 모두 모은다.
python
for row, line in enumerate(wallpaper):
for col, char in enumerate(line):
if char == '#':
position.append((row, col))
2
좌표별 min/max 구하기
모은 위치들을 순회하면서 최솟값과 최댓값을 갱신한다. 초기값은
float('inf') / float('-inf')로 잡아, 어떤 좌표와 비교해도 무조건 갱신되도록 했다.python
for (row, col) in position:
lux = min(lux, row)
luy = min(luy, col)
rdx = max(rdx, row)
rdy = max(rdy, col)
3
오른쪽 아래 좌표만 +1 보정
칸 인덱스 자체는 격자점이 아니라 "칸의 시작 위치"이기 때문에, 그 칸까지 완전히 덮으려면 오른쪽·아래쪽 경계 좌표에 1을 더해야 한다.
python
return (lux, luy, rdx + 1, rdy + 1)
"경계값을 그대로 쓸지 +1 할지"를 헷갈리지 않는 게 이런 좌표/경계 변환 문제의 핵심 포인트였다 — 어제 풀었던 날짜 비교 문제의
today_days >= days 처리와 비슷한 맥락.고도화
튜플 리스트에 (row, col)을 같이 담고 나중에 다시 풀어서(unpack) min/max를 구하는 대신, 처음부터 row 모음과 col 모음을 분리된 두 리스트로 저장했다. 그러면 파이썬 내장
min()/max()를 리스트 전체에 바로 적용할 수 있어서, 갱신용 두 번째 for문이 통째로 사라진다.✦ 고도화된 코드
python
def solution(wall):
a, b = [], []
for i in range(len(wall)):
for j in range(len(wall[i])):
if wall[i][j] == "#":
a.append(i)
b.append(j)
return [min(a), min(b), max(a) + 1, max(b) + 1]
고도화 포인트
1. row/col을 따로 저장 —
2. inf/−inf 초기화 제거 — 한 칸씩 비교하며 갱신하는 대신, 리스트를 다 채운 후
3. enumerate 대신 range(len()) — 이건 사실 약간 후퇴한 부분이다. enumerate가 더 파이썬스럽고 가독성이 좋은데 바뀌었다.
4. 코드 길이 단축 — 변수 수(position, lux, luy, rdx, rdy → a, b)와 루프 수(2개 → 1개)가 줄어 라인 수가 거의 절반이 됐다. 다만
a(row 모음), b(col 모음) 두 리스트로 분리해 min(a), max(a)처럼 내장 함수를 바로 적용할 수 있게 됐다.2. inf/−inf 초기화 제거 — 한 칸씩 비교하며 갱신하는 대신, 리스트를 다 채운 후
min()/max()를 한 번에 호출한다.3. enumerate 대신 range(len()) — 이건 사실 약간 후퇴한 부분이다. enumerate가 더 파이썬스럽고 가독성이 좋은데 바뀌었다.
4. 코드 길이 단축 — 변수 수(position, lux, luy, rdx, rdy → a, b)와 루프 수(2개 → 1개)가 줄어 라인 수가 거의 절반이 됐다. 다만
a, b로 축약되면서 가독성은 떨어졌다 — row/col처럼 의미가 드러나는 이름이 유지보수 측면에선 더 낫다.핵심 인사이트
✓핵심 로직(격자점 변환을 위한 +1)은 그대로고, "튜플 리스트 + 두 번째 순회"를 "분리된 두 리스트 + 내장 min/max"로 바꿔서 코드를 단축한 게 고도화의 본질이다.
✓짧은 코드가 항상 좋은 코드는 아니다 — enumerate→range, 의미 있는 변수명→a/b처럼 가독성을 희생하는 트레이드오프도 있다.
| 한 줄 회고 | 인덱스와 격자점의 차이 — "어디서 +1을 해야 하는가"를 정확히 짚어내는 게 이런 류 문제의 핵심이었다 |
psychology 오늘 들었던 생각
오늘은 코테 한 문제만 풀고 쉬었다. 쉬는 김에 MBC 예능 놀러코스터를 봤는데, 노홍철·최강록·빠니보틀·고경표가 나와서 전 세계 놀이공원을 돌아다니는 내용이었다. 하고 싶은 걸 하며 사는 모습이 정말 멋있어 보였는데, 동시에 그게 가능한 이유는 결국 각자 자기 일을 열심히 해왔기 때문이라는 생각이 들었다. 내일 오티를 시작으로 7개월간의 부트캠프가 본격적으로 시작된다. 나도 개발자로 취업하고 싶다는 목표를 위해 이 7개월을 버텨내면서, 언젠가 나만의 방식으로 하고 싶은 걸 하며 사는 삶을 만들어보고 싶다.
rate_review 마무리
코테 한 문제로 가볍게 마무리한 휴식일. 내일부터 시작되는 7개월을 위해 잠시 숨을 고른 하루.
checklist 내일 할 일
- 코드잇 스프린트 오리엔테이션 참여
반응형
'AI' 카테고리의 다른 글
| [부트캠프 1일차] 코드잇 스프린트 시작 — 데이터란 무엇인가 (1) | 2026.07.02 |
|---|---|
| [D-1] 코드잇 스프린트 환영회 (0) | 2026.07.01 |
| [D-3] 시각화 도구 3종 비교 (0) | 2026.06.29 |
| [D-4] seaborn으로 상관관계 보기 (0) | 2026.06.28 |
| [D-5] 통계 기초 완주 — 박스 플롯부터 누적값까지 (0) | 2026.06.27 |
