예전에는 블로그에 회고를 쓰고, 글을 쓸 때 누군가 보겠지.. 라는 생각을 그리 많이 하지 않았다. 언제나 양질의 글을 쓸 수 있는 건 아니지만, 최근 회고 글의 조회수도 늘어가는 걸 보면서 글 하나하나를 신중하게 써야겠다는 생각이 들었다.
✅ 오늘의 TODO
- 알고리즘
- 오늘의 문제 ✅
- Class2 문제 1개 ✅
- 알고리즘 스터디 20:00 - 22:00 ✅
- 컴피
- 위치 기능 구현 🔜
- 컴피존 설정 화면 구현 ✅
- TIL 작성 ✅
🌼 오늘의 문제 - 백준 16401. 과자 나눠주기
과자 막대들의 길이가 주어지고, 조카들에게 나눠줄 수 있는 최대의 길이를 구하는 문제였다. 과자 막대들은 쪼갤 수 있다. 처음에는 조카의 수가 과자 막대의 수보다 많을 때, 과자를 '잘' 쪼개서 주는 방법으로 풀이했다. 그런데 바로 틀렸고, 문제 풀이 방법을 참고했다. '이진탐색'으로 푸는 문제였던 것! 쪼개질 수 있는 과자 막대의 길이를 반씩 탐색해 가면서(이진 탐색) 최대 막대 길이를 구하는 방법! 총 세 가지 풀이로 풀 수 있었는데, 가장 마음에 드는 풀이부터 공유해보려고 한다.
def check(mid):
count = 0
for cookie in cookies:
count += cookie // mid
""" 쪼개진 막대 수가 조카 수보다 크거나 같으면 가능하다는 뜻! """
if count >= m:
return True
return False
def solution3():
low, high = 1, max(cookies)
while low <= high:
print(low, high)
mid = (low + high) // 2
if check(mid):
""" 가능할 땐, 작은 값을 올려서 더 큰 값들을 탐색 """
low = mid + 1
else:
""" 불가능할 땐, 큰 값을 줄여서 더 작은 값들을 탐색 """
high = mid - 1
print(high)
solution3()
ㅋㅋㅋ 너무 부끄럽지만 내가 처음 풀었던 방법은 아래 코드다. 틀린 풀이이지만, 그냥 뭔가 웃겨서 남겨보려고 한다.
def solution1():
if m <= n:
print(cookies[n - m])
elif sum(cookies) < m:
print(0)
else:
while len(cookies) < m:
last = cookies.pop()
cookies.append(last // 2)
cookies.append(last - last // 2)
cookies.sort()
print(cookies[0])
이제 뭔가 알고리즘 자체에 대한 공백이 느껴지기 시작한다. 처음에는 내가 공부를 덜 해서 계속 학습하면서 익숙해지는데 집중했다면, 이젠 정말 문제를 보고 자료구조나 알고리즘을 떠올리기 위해 공부하는 방법을 조금씩 바꿔야겠다는 생각을 했다.
🌼 Class 2 문제 - 백준 1676. 팩토리얼 0의 개수
문제는 간단하다. 팩토리얼 값에서 마지막 0의 개수를 세는 것. 마지막에 0이 나오려면 2와 5가 하나의 쌍으로 나와야 한다. 그런데 2는 뭐 너무 많이 있기 때문에, 5의 개수만 세면 된다. 여기서 나는 5의 개수를 세고, 25의 개수를 세고, 점점 5를 곱해가며 개수를 세었다. 다른 풀이 방식을 보니 n 자체를 5로 나눠가며 풀이한 방법도 있었다. 예를 들어 50이라면 50 //= 5 (count += 10), 10 //= 5 (count += 2). 이런 느낌? 나는 내 풀이가 좀 더 직관적으로 이해 가는 풀이라고 생각해서 그대로 두었다.
n = int(input())
count = 0
divider = 5
while n >= divider:
count += n // divider
divider *= 5
print(count)
👀 컴피 - 컴피존 Bottom Sheet 화면 개발
Feat: 컴피존 세팅 > Bottom Sheet Views by anjiniii · Pull Request #26 · HorangITBeanS/COMFIE-iOS
About this PR 🔖 Related Issue ✨ Feat: 04-컴피존 설정 > Bottom sheet #25 📚 Contents 컴피존 설정 화면에서 아래 시트에 해당하는 View를 구성했습니다. View에서 직접 조건에 따라 분기 처리하는 것이 아니라
github.com
이번 주에는 꼭 끝내야 할 컴피 개발!! 이번 화면에서는 Bottom Sheet 처럼 보이는 View에서 Cell이 사용자의 상태에 따라 달라지는 걸 구현했다. 처음에는 View에서 직접, 사용자의 위치 권한 여부나 현재 위치 같은 것들을 반영하려고 했다. 그런데 Intent를 사용하면서 굳이 직접 View가 상태를 판단할 필요가 없다고 생각했다. Intent, 즉 사용자의 의도에 따라 View의 타입이 변경되면 된다. 그리고 동일한 View 또는 Button이 상태에 따라 다른 동작을 한다면, 해당 intent에서 상태에 따라 다른 action을 처리하도록 하면 된다. 그래서 사실상 거의 처음으로 View를 단지 보이는 것에 따라 분리해 본 것 같다.
🌟 Concurrency - Task
Task에 대한 강의를 들었다. 사실 Task 보다도 self 를 캡처하는 현상을 좀 더 잘 이해하게 된 것 같다. Task는 암시적으로 self를 캡처하기 때문에 명시적으로 self를 캡처할 필요가 없다. 추가로 알아서 마지막에 메모리에서 해제하기 때문에 weak self를 둘 필요도 없다고 한다. 그런데 그 이전에 활용했던 GCD 방식을 보면서 오히려 이전 개념을 좀 더 잘 이해하게 된 것 같다. 이제 Concurrency 강의 초반인데, 이번 주에 얼른 후딱 들어야겠다.
🍀 오늘의 회고
스터디 카페에 사람이 많아졌다. 시험기간 + 소문이 난 게 아닐까 싶다! 역시나 집을 나섰더니 집중이 잘된다. 이번주에 빠르게 마감해야 할 컴피 개발을 끝내고, Concurrency 강의도 마무리해야겠다. 알고리즘을 매일 푸는 것에 익숙해지면서 오히려 점점 알고리즘 자체에 대한 학습이 부족했다는 생각이 들기 시작했다. 물론 늘 병행하면서 공부해야겠지만! 이전에 풀던 책을 이어서 풀어야겠다.
'🐥 Records > Daily | Today I Leared' 카테고리의 다른 글
[TIL] 99클럽 코테 스터디 13일차 TIL + 문자열, CoreLocation (2) | 2025.04.17 |
---|---|
[TIL] 99클럽 코테 스터디 12일차 TIL + DP, (SwiftUI) Map 오류 (0) | 2025.04.16 |
[TIL] 99클럽 코테 스터디 10일차 TIL + 그리디 (0) | 2025.04.14 |
[TIL] 99클럽 코테 스터디 9일차 TIL + 그리디 (0) | 2025.04.11 |
[TIL] 99클럽 코테 스터디 8일차 TIL + 문자열, 정규표현식 (0) | 2025.04.10 |