✅ 오늘의 TODO
지터스 오프라인 모임이 있는 날이다.. 하지만 감기가 아직 낫지 않아서 못 갔다ㅠㅜ 너무 아쉽지만 다음 모임에는 꼭 참여해야지! 그래도 목이랑 몸 컨디션이 많이 좋아졌다. 내일은 운동도 가고 나가서 공부해 봐야지.
(✅ 완료 / 🔜 진행 중 / ❌ 미완료)
- 알고리즘(오늘의 문제 ✅, 챌린저 문제 🔜, 이코테 ❌)
- TIL 작성 ✅
- 혼공네트워크 2장 물리 계층, 데이터 링크 계층 읽기
- 컴피
- 위치 기능 구현
- 컴피존 설정 화면 구현
- 13주차 주간 회고
🌼 오늘의 문제 - 프로그래머스 바탕화면 정리
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
🔖 문제 분석
- 오늘은 문제 길이가 길어서 링크로 남겼다!
- 이차원 배열에서 모든 값을 포함하는 영역을 출력하는 문제
- 구현 + 완전탐색..? 인가..? (아직 이런 분류는 잘 모르겠다 ㅎㅎ)
- 가로/세로의 길이가 최소 1에서 최대 50 -> 최대 2500칸으로 완전 탐색에 큰 무리는 없을 것 같다
🔖 문제 풀이
제일 먼저 풀이한 방법이다. 최대가 50 임을 이미 알고 있으니 최솟값을 먼저 50 이상의 수로 초기화했다. 문제 풀이의 기본적인 아이디어는 모든 문자를 반복하면서 #이 존재하는 최소 좌표와 최대 좌표를 구하는 것! 그리고 마지막에 최대 좌표에 1을 더해 영역의 마지막 좌표를 완성하면 된다. 무리 없이 모든 케이스를 통과했다.
# 시간 복잡도 O(n*m), 공간 복잡도 O(1)
def solution(wallpaper):
min_x, min_y, max_x, max_y = 99, 99, 0, 0
for i in range(len(wallpaper)):
line = wallpaper[i]
for j in range(len(wallpaper[0])):
if line[j] == "#":
min_x = min(i, min_x)
min_y = min(j, min_y)
max_x = max(i, max_x)
max_y = max(j, max_y)
answer = [min_x, min_y, max_x + 1, max_y + 1]
return answer
GPT의 리뷰를 받아보았는데, 꽤 좋은 인사이트를 얻었다. 나는 단순히 제한된 범위만 보고 최소/최대 좌표들을 각각 0과 99로 초기화했는데, 오히려 더 작은 값과 더 큰 값을 안전하게 활용할 수 있었다. 그리고 index가 필요해서 배열의 길이를 구해서 활용했지만, enumerate를 쓰니 index와 값을 모두 쓸 수 있었다. 굿!!
import sys
def solution(wallpaper):
min_x, min_y = sys.maxsize, sys.maxsize # 범위 제한과 상관없이 안전하게 최대값 구하기 가능
max_x, max_y = -1, -1 # 범위 내에 포함하는 0 대신에 더 작은값 가능
for i, row in enumerate(wallpaper): # enumerate를 활용해 값과 index 모두 활용 가능
for j, char in enumerate(row):
if char == "#":
min_x = min(min_x, i)
min_y = min(min_y, j)
max_x = max(max_x, i)
max_y = max(max_y, j)
return [min_x, min_y, max_x + 1, max_y + 1]
다른 사람들 풀이를 보니 배열을 활용해 #이 존재하는 모든 좌표를 담아두고 마지막에 최소/최대를 구하는 답안도 있었다. 이렇게 구성하면 가독성이 더 좋아지나? 흠 최소/최대를 한 번만 계산한다는 점이 와닿을 수는 있지만, 내 풀이가 좀 더 직관적이라고 느꼈다. (내 생각!)
# 시간 복잡도 O(n*m), 공간 복잡도 O(k) k: #의 개수
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]
🔖 새롭게 느낀 점
문제를 푸는 것보다 코드 리뷰 + 다른 사람들의 풀이를 보면서 더 많이 얻어가는 것 같다. 문제 난이도가 그렇게 어렵지 않아서인지 오히려 알고리즘 풀이에 익숙해져 가고 있고, 자신감을 얻어가는 것 같다. 파이썬을 더 적극 활용하는 다양한 기능들을 알아보는 게 재밌다.
🍀 오늘의 회고
챌린저 문제를 풀다가 다 끝내지 못했다. MITM(Meet in the Middle) 중간에서 만나기라는 알고리즘을 쓴다고 하는데, 아직 완전히 이해해서 내 걸로 만들지 못했다. 내일 아침에는 오늘 문제와 이 문제를 풀어야겠다. 몸이 거의 다 회복한 것 같으니, 내일부터는 다시 힘내서 몰입해 보자!!!
내일 할 일
- 알고리즘(오늘의 문제, 챌린저 문제)
- 혼공네트워크 2장 물리 계층, 데이터 링크 계층 읽기
- 컴피
- 위치 기능 구현
- 컴피존 설정 화면 구현
- 이력서/포트폴리오 보강하기
- 13주차 주간 회고
- TIL 작성
'🐥 Records > Daily | Today I Leared' 카테고리의 다른 글
[TIL] 99클럽 코테 스터디 4일차 TIL + BFS, DFS (0) | 2025.04.04 |
---|---|
[TIL] 99클럽 코테 스터디 2일차 TIL + DP(피보나치) (2) | 2025.04.02 |
[TIL] 99클럽 코테 스터디 1일차 TIL + 소수판별, 최빈값 구하기 (0) | 2025.04.01 |