🐥 Records/Daily | Today I Leared

[TIL] 99클럽 코테 스터디 3일차 TIL + 프로그래머스 바탕화면 정리

이오🐥 2025. 4. 3. 01:12

✅ 오늘의 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 작성