[okyungjin] WEEK 04 Solutions (최적화)#2759
Conversation
📊 okyungjin 님의 학습 현황이번 주 제출 문제
누적 학습 요약
문제 풀이 현황
🤖 이 댓글은 GitHub App을 통해 자동으로 작성되었습니다. 🔢 API 사용량 (gpt-5-nano)
|
|
@parkhojeong @alphaorderly 코치님들 안녕하세요. 다른 분들 PR 내용 참고해서 최적화 로직을 적용했는데 리뷰 부탁드려도 될까요? |
|
사실 너무 꽤나 깔끔하게 잘 하셔서 더이상 말이 필요 없을 정도네요 |
parkhojeong
left a comment
There was a problem hiding this comment.
최적화 시도 해보신거 멋지네요! 몇 가지 커멘트 남겼습니다.
| # 모든 동전 종류를 확인하여 현재 금액을 만들 수 있는 조합 탐색 | ||
| for coin in coins: | ||
| # coins가 정렬되어 있으므로, cur_amount 보다 동전의 금액이 더 크면 이후는 확인 불필요 | ||
| if coin > cur_amount: | ||
| break | ||
|
|
||
| # 둘 중 더 작은 값으로 업데이트 | ||
| # 1. 기존에 구한 개수 | ||
| # 2. 현재 동전을 1개 추가해서 만드는 개수 | ||
| min_coins[cur_amount] = min(min_coins[cur_amount], min_coins[cur_amount - coin] + 1) | ||
| # 동전 금액이 현재 금액보다 작거나 같을 때만 유효한 조합으로 간주 | ||
| if coin <= cur_amount: | ||
| # '남은 금액을 만드는 최소 개수' + '현재 동전 1개'를 합산 |
There was a problem hiding this comment.
if coin <= cur_amount 로직을 포문 안에서 계속 돌게 해주신 이유가 있을까요?
There was a problem hiding this comment.
원래는 coins를 정렬한 뒤 if coin > cur_amount: break 조기 종료 조건을 사용했었는데요. 코드를 더 간결하게 다듬기 위해 정렬을 없애고 부등호를 뒤집는 방향으로 수정했습니다.
coins 배열 길이가 최대 12라 break 유무에 따른 성능 차이가 크지 않을 것 같아 로직을 간소화해 보았습니다!
There was a problem hiding this comment.
사담이지만 그 아래 라인에 있는 min 함수를 제거하니 성능이 훨씬 좋아지더라구요
min_coins[cur_amount] = min(min_coins[cur_amount], min_coins[cur_amount - coin] + 1)if문 형태로 필요할 때만 할당하도록 하니 런타임 백분위가 30% 올라갔던 것 같습니다.
There was a problem hiding this comment.
맞아요, max나 min으로 하는게 코드상 보기 좋고 쓰기도 편한게 맞는데
성능은 은근히 차이가 나더라구요
몇몇 문제는 100~200ms 가량 차이나는것도 본적 있어요
| # 트리가 비어있으면 길이는 0 | ||
| if root is None: | ||
| return 0 | ||
|
|
||
| max_depth = 1 | ||
|
|
||
| # 스택에 (현재 노드, 노드의 깊이) 튜플을 저장 | ||
| stack = [(root, 1)] | ||
|
|
||
| while stack: | ||
| node, cur_depth = stack.pop() | ||
|
|
||
| # 현재 노드의 깊이와 저장된 최댓값을 비교하여 갱신 | ||
| max_depth = max(cur_depth, max_depth) | ||
|
|
||
| # 왼쪽 자식 노드가 있다면 현재 깊이 + 1을 하여 스택에 추가 | ||
| if node.left: | ||
| stack.append((node.left, cur_depth + 1)) | ||
|
|
||
| # 오른쪽 자식 노드가 있다면 현재 깊이 + 1을 하여 스택에 추가 | ||
| if node.right: | ||
| stack.append((node.right, cur_depth + 1)) |
There was a problem hiding this comment.
다른 파일들 포함해서 주석을 많이 달아주셨는데 코드만으로 충분한 것들이 많은 것 같아요!
코드를 통해서 최대한 의도를 드러내고 꼭 필요한 상황에만 적어주시는 편이 좋을 거 같아요. 주석도 같이 읽어야 해서 인지적 부하도 올라가고 가독성이 떨어지는 부분도 생기기도 해서요. 특히 코드와 주석이 정확히 일치하지 않는 경우가 생기지 않도록 조심해야 하는 거 같아요.
| # 빈도수가 더 적은 글자부터 탐색하도록 단어를 뒤집는다 | ||
| count_first = sum(row.count(word[0]) for row in board) | ||
| count_last = sum(row.count(word[-1]) for row in board) | ||
|
|
||
| if count_first > count_last: | ||
| word = word[::-1] |
There was a problem hiding this comment.
인풋의 패턴을 파악해서 최적화 한다는 점에선 좋은 접근인 거 같습니다. 다만 첫글자와 마지막 글자의 빈도만 비교해서 최적화하는건 특수한 케이스만 커버가 될 거 같아요. 리트코드 채점 데이터셋엔 이 경우가 들어간 거 같더라구요.
|
리뷰 정성스럽게 남겨주셔서 정말 감사드립니다 : ) 시간이 다 되어서 PR은 머지해두도록 하겠습니다! |
답안 제출 문제
다른 분들 PR에 있는 내용 참고하여 최적화 적용했습니다.
작성자 체크 리스트
In Review로 설정해주세요.검토자 체크 리스트
Important
본인 답안 제출 뿐만 아니라 다른 분 PR 하나 이상을 반드시 검토를 해주셔야 합니다!