🐥 Records/Daily | Today I Leared

[TIL] 99클럽 코테 스터디 2일차 TIL + DP(피보나치)

이오🐥 2025. 4. 2. 02:23

✅ 오늘의 TODO

"남의 시선이 날 만들어 가는 게 아니라, 너의 시선이 널 만들어 가는 거야. 그러니까 너 자신을 좀 더 칭찬해 주고 따뜻하게 바라봐 줘. 너 지금 아주 잘하고 있어. 그동안 들인 그 너의 노력을 한번 믿어봐. 실수할까 움츠러들지 말고. 남이 날 어떻게 볼지, 어떻게 생각할지, 조마조마해하지도 말고."

 

2025년의 4분의 1이 지났다. 오늘은 4월을 어떻게 보낼지, 그리고 어떤 공부를 할지 계획해야지! 알고리즘 스터디로 매일 문제 풀기, 네트워크 책을 얼른 읽기, 컴피 개발 마무리하기, 마디 워치 기능개발하기, 리팩토링 고민하기, 그리고 UIKit이랑 Concurrency 공부하기!! 파이팅 하고 4월에는 해내보자!

 

- 21:30 구떠리 회의 ✅

- 22:30 코넥독 회의 -> 서면 대체 ✅

 

- 4월 계획 세우기! 벌써 4월이라니~ ✅

- 13주차 주간 회고 작성하기 ❌

- TIL 작성하기 ✅

 

- 알고리즘 오늘의 문제 풀기 ✅

- 컴피 네비게이션 바 개발 마무리 ✅

- 마디 잠금화면 위젯 기능 배포 ✅

 

 

🌼 오늘의 문제 - 백준 14495. 피보나치 비스무리한 수열

 

🔖 문제 분석

- 피보나치? 점화식 수열은 전형적인 DP 문제다.

- 입력이 116까지로 시간 복잡도를 아주 고려할 필요가 없다고 생각할 수 있지만, 재귀로 풀면 시간 초과의 위험이 있다..

 

🔖 문제 풀이

제일 먼저 풀이한 방법은 재귀 방식이었다. 그냥 피보나치 수열을 굉장히 직관적으로 작성할 수 있어서 그리 어렵지 않다.

def solution_fibo(n):
    if n in [1, 2, 3]:
        return 1

    answer = solution_fibo(n - 1) + solution_fibo(n - 3)
    return answer

 

하지만 역시나 재귀는 시간 초과의 위험이 너무 크기 때문에 바로 DP로도 풀이했다. 바텀업 방식으로 아래에서부터 계산해 나가는 방식이 좀 더 직관적이고, 효율적이라고 느꼈다. 재귀를 쓰고 탑다운 형태로 간다면, 메모이제이션을 활용할 수도 있을 것이다.

 

Dynamic Programming, DP, 동적 계획법을 다시 정리해보면, "큰 문제를 작은 문제로 나누고, 그 결과를 저장하여 중복 계산을 피하는 알고리즘"이다. 아래 코드에서 f(1), f(2), f(3) 값을 지정한 이후부터는 dp 배열에 값을 하나씩 저장하며 다시 계산을 피하고 있다. 참고로 사용하지 않는 0부터 들어가 있지만 인덱스를 n 자체로 사용하고자 했다. dp[3]이 f(3) 값이라고 보면 된다.

# 시간 복잡도 O(n), 공간 복잡도 O(n)
def solution_dp(n):
    if n in [1, 2, 3]:
        return 1

    dp = [0] * (n + 1)
    for i in range(4):
        dp[i] = 1

    for i in range(4, n + 1):
        dp[i] = dp[i - 1] + dp[i - 3]

    return dp[n]

 

이 코드를 GPT에게 리뷰를 맡겼는데, 공간 복잡도를 더 효율적으로 만들 수 있는 코드를 알려주었다. dp 배열에 저장하지 않고, 변수에 값을 저장해서 활용하는 방식이다. 실제로 백준 풀이에 두 방식을 모두 썼지만, 오히려 아래 코드가 더 오랜 시간이 걸렸다(?)

# 시간 복잡도 O(n), 공간 복잡도 O(1)
def solution_dp2(n):
    if n in [1, 2, 3]:
        return 1

    a, b, c = 1, 1, 1
    for i in range(4, n + 1):
        a, b, c = b, c, a + c

    return c

 

🔖 새롭게 느낀 점

사실 얼마 전까지만 해도 DP 문제를 보고 일반식을 구하던 나였는데, 피보나치를 보고 바로 DP가 떠오르다니! 알고리즘에 점점 익숙해지고 있다는 생각이 든다. 파이팅!

 

 

☘️ 마디 - 오늘의 소확행 잠금화면 위젯 개발

마디의 기능 '오늘의 소확행 선물'을 드디어 잠금화면에도 만들었다. 하나의 기능도 다양하게 제공할 수 있다니 너무 좋다. 좋다고만 하기엔 뭔가 아쉬운 느낌이고, 넓은 범위의 공부를 할 수 있어서 좋다. 심사도 넘겼고, 문제가 없기를! 휴우 이제 곧 있을 리팩토링을 어서 고려해야 하는데, 긴장된다! 다시 코드를 보니 리팩토링이 급하다는 느낌이 든다.

 

 

👀 컴피 - 네비게이션바 커스텀

 

✨ Feat: 네비게이션바 공통 컴포넌트로 구현 by anjiniii · Pull Request #16 · HorangITBeanS/COMFIE-iOS

About this PR 🔖 Related Issue 이슈 생성 없이 컴피존 세팅 화면 구현 중에 만들었어요! 📚 Contents 컴피 네비게이션바 제작 기본 네비게이션바 삭제 및 뒤로가기 제스처 활성화 (추가된 변경사항) 뒤

github.com

컴피앱의 네비게이션바 변경사항이 생겨서 오늘 반영했다. 주요 변경사항은 아래 세 가지이다.

1. 뒤로가기 버튼에 추가 액션이 가능하도록 (기존에는 별도 액션 없었음)

2. 버튼이 커스텀 가능한 View이도록 (기존에는 Image만 있었음)

3. 한 쪽에도 여러 개의 버튼이 위치할 수 있도록 (기존에는 1개 혹은 0개)

 

이제 다시 내일부터는 위치 기능 개발에 몰입할 수 있을 것 같다!!

 

 

🍀 오늘의 회고

알고리즘 문제를 매일 풀기 시작하면서 '매일' 하는 무언가가 있다는 것이 뿌듯하다. 내일부터는 이코테 책 문제도 한 문제씩 더 풀어보려고 한다. 책을 얼른 1 회독하고 싶기 때문! 오늘 풀이했던 문제는 아주 어렵지 않았는데, 챌린저에게 제공되는 문제도 풀어볼까 생각 중이다. 이코테 문제까지 풀면 하루에 총 3문제를 풀게 되는 건데, 흠 괜찮은 것 같기도 하고?!

 

마디 잠금화면 위젯 코드를 배포했다. 곧 인스타에도 업데이트 소식이 전해질 수 있을 것 같다. 오늘 마디 전체 회의와 기획 회의를 했다. 기획 회의에서는 '기록' 화면의 상세 기능을 논의했다. 소확행 실천 기록과 함께 하루를 기록하며 마무리하는 기능이 추가되었다. 아직 확정은 아니지만 좀 더 감정을 되돌아볼 수 있는 것 같아서 마음에 든다. 정말 사소해 보이지만 '마음'으로 표현할까, '일기'로 표현할까 와 같이 단어 하나로 논의하기도 했는데, 작은 부분에서도 사용자에게 제공하는 전체적인 느낌이 달라질 수 있다는 생각에 신중하게 된다. 기획이 점차 윤곽을 그려나갈수록 얼른 리팩토링 뼈대를 잡아야 한다는 생각이 든다. 빨리 시작하자 -> 다음 주? ㅎㅎㅎ

 

어제오늘 아파서 제대로 집중하지 못했는데, 몸이 점점 나아지는 것 같다. 하지만 이 상태로는 내일 지터스 오프라인 모임에는 아무래도 못 나갈 것 같다.. 아쉽지만 감기를 옮길 수는 없다! 그리고 나도 얼른 회복해야지.

 

내일 할 일!

- 알고리즘(오늘의 문제, 챌린저 문제, 이코테)

- 혼공네트워크 2장 물리 계층, 데이터 링크 계층 읽기

- 컴피

  - 위치 기능 구현

  - 컴피존 설정 화면 구현

- 13주차 주간 회고

- TIL 작성