🐥 Records/Daily | Today I Leared

[TIL] 99클럽 코테 스터디 18일차 TIL + DP, Swift 알고리즘

이오🐥 2025. 4. 24. 00:14

🍀 오늘의 회고

매일 회고를 쓰다 보니 주간회고를 미루게 된다. 이번 주가 TIL을 써야 하는 마지막 주간인데, 아마도 다시 주간회고 정도로 돌아갈 것 같다. 대신 좋은 점은 일주일을 모두 보내고 쓰는 것보다 조금씩 기록해 두면 좋다는 생각을 했다. 오늘은 티나와 소비짹, 컴피 이야기와 면접 이야기를 나눴다. 언제나 너무 편하고 긍정적인 에너지를 주는 티나. 내 주변에서 악쿠가 가장 나를 감정적으로 공감해 준다는 이야기를 했다. 티나는 내가 작업하는 모습을 바로 옆에서 지켜보면서 잠재력을 느꼈고, 무엇을 하든 잘 될 것 같다는 생각에 항상 그렇게 긍정적인 공감을 해줄 수 있었다고 했다. 곁에 둘 수 있어서 너무 감사한 사람이다. 파이팅 나의 컴피 PM!!

 

✅ 오늘의 TODO

- 알고리즘

  - 오늘의 문제 ✅

  - Swift 프로그래머스 코딩기초트레이닝 2일차 ✅

- 면접 준비 🔜(진행중)

 

🌼 오늘의 문제 - 백준 27971. 강아지는 많을수록 좋다

앞으로 나갈 수 있는 칸의 개수 2개(a와 b)가 주어지고, 도착해야 하는 칸과 갈 수 없는 칸들이 주어진다. 최소한 움직여서 도달할 때, 움직인 수를 구하는 문제였다. 처음부터 DP로 풀어야겠다고 생각했다. 이제는 Bottom-up으로 아래에서부터 생각하는 연습이 조금씩 되어 있는 것 같다. 1번 칸에 도달하는 수, 2번 칸에 도달하는 수, 이렇게 접근해야겠다는 생각으로 시작했다. 그럼 어떻게 다음 칸이 나의 이동 횟수를 알게 될까? 이게 문제였다. 여기서는 아주 살짝 힌트를 얻었는데, 나아갈 수 있는 칸의 개수인 a와 b칸 이전 칸 값에서 유효한 값이라면 1을 더하면 되는 것! 그렇게 문제를 풀었고, 한 번에 정답을 맞힐 수 있었다. 오예.

n, m, a, b = map(int, input().split())
INF = 999999999
dp = [INF] * (n + 1)
dp[0] = 0

for _ in range(m):
    start, end = map(int, input().split())
    for i in range(start, end + 1):
        dp[i] = -1

for i in range(1, n + 1):
    # 닫힌 구간
    if dp[i] == -1:
        continue

    # 이전 값에서 더해질 수 있으면 변경
    min_a, min_b = INF, INF
    if -1 < dp[i - a] < INF:
        min_a = dp[i - a]
    if -1 < dp[i - b] < INF:
        min_b = dp[i - b]
    dp[i] = min(min_a, min_b) + 1

if dp[n] >= INF:
    print(-1)
else:
    print(dp[n])

 

 

🌼 Swift 프로그래머스 코딩기초트레이닝 2일 차

문제가 어렵진 않지만, Swift에서 문자열을 다루는 방식을 익히기에 아주 좋다. 파이썬처럼 바로 문자열 슬라이싱을 해버리려고 생각해 보니, 스위프트는 그렇게 간단하지 않았다. 다른 사람들의 풀이도 많이 참고하고, GPT에게 가장 최선인지도 많이 물어봤다. 그래도 Swift랑 더 친해지는 기분이라서 좋다.