[okyungjin] WEEK 02 solutions#2683
Conversation
📊 okyungjin 님의 학습 현황이번 주 제출 문제
누적 학습 요약
문제 풀이 현황
🤖 이 댓글은 GitHub App을 통해 자동으로 작성되었습니다. 🔢 API 사용량 (gpt-5-nano)
|
| curr = prev2 + prev1 # 현재 계단 | ||
| prev2 = prev1 | ||
| prev1 = curr |
There was a problem hiding this comment.
| curr = prev2 + prev1 # 현재 계단 | |
| prev2 = prev1 | |
| prev1 = curr | |
| prev2, prev1 = prev1, prev2 + prev1 |
파이썬이니까 동시 할당을 활용하는 방법도 있을 것 같아요.
There was a problem hiding this comment.
감사합니다! 개인적으로 curr로 작성해주는게 가독성이 더 좋다고 생각해서 풀어서 작성했습니다.
| prev2 = 1 # 전전칸 까지의 경우의 수 | ||
| prev1 = 2 # 전칸 까지의 경우의 수 | ||
|
|
||
| for _ in range(2, n): |
There was a problem hiding this comment.
개인적으로는 3번째 계단에서 시작하는 거면, 3이라고 명시하는 걸 더 선호해서요. 이렇게도 쓸 수 있을 것 같아요.
| for _ in range(2, n): | |
| for _ in range(3, n+1): |
| if len(s) != len(t): | ||
| return False | ||
|
|
||
| counter = Counter(s) | ||
|
|
||
| for char in t: | ||
| if counter[char] >= 1: | ||
| counter[char] -= 1 | ||
| else: | ||
| return False | ||
|
|
||
| return True |
There was a problem hiding this comment.
Counter 라는 것은 처음 보는데 아주 편리하게 쓸 수 있네요. 어차피 Counter 객체를 쓴다면 비교 연산으로 더 간단히 표현이 가능한 것 같아요. 찾아보니 Counter가 내부적으로 각 문자의 등장 횟 수를 dict 타입으로 반환하고, dict 타입은 == 연산자로 동일 비교가 가능하네요.
| if len(s) != len(t): | |
| return False | |
| counter = Counter(s) | |
| for char in t: | |
| if counter[char] >= 1: | |
| counter[char] -= 1 | |
| else: | |
| return False | |
| return True | |
| # s가 "apple" 일 때, Counter({'p': 2, 'a': 1, 'l': 1, 'e': 1}) | |
| return Counter(s) == Counter(t) |
There was a problem hiding this comment.
@dahyeong-yun 오오 이런 방법도 있네요. 파이썬은 == 으로 비교하면 참조가 아니라 값으로 비교하는 특성이 있군요. 감사합니다 ㅎㅎ!!
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Dynamic Programming
- 설명: 피보나치-like 점화식을 이용해 연속한 부분문제의 해를 합산하는 DP 패턴으로, 각 계단 수를 이전 두 값의 합으로 계산하며 공간을 상수로 유지합니다.
📊 시간/공간 복잡도 분석
| 복잡도 | |
|---|---|
| Time | O(n) |
| Space | O(1) |
피드백: 연산은 n-2까지 한 번의 반복으로 따질 수 있도록 prev1, prev2를 유지한다. 상수 공간으로 풀이 가능하다.
개선 제안: 현재 구현이 적절해 보입니다.
💡 풀이에 시간/공간 복잡도를 주석으로 남겨보세요!
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Two Pointers, Dynamic Programming, Hash Map / Hash Set, Greedy, Divide and Conquer, Monotonic Stack, Binary Search, Trie, Bit Manipulation, Heap / Priority Queue, BFS, DFS, Union Find, Backtracking
- 설명: 주어진 solution은 왼쪽-누적 곱(prefix)과 오른쪽-누적 곱(suffix)을 이용해 각 위치의 곱을 구하는 방식으로 O(N) 시간과 상수 외 추가 공간으로 계산합니다. 결과적으로 배열 각 원소를 제외한 곱을 구하는 최적 패턴으로, 공간 절약을 위해 중간 저장 없이 합성하는 아이디어가 핵심입니다.
📊 시간/공간 복잡도 분석
| 복잡도 | |
|---|---|
| Time | O(n) |
| Space | O(1) |
피드백: 두 패스 수행으로 각 원소의 왼쪽과 오른쪽 곱을 결합한다. 추가 배열 없이도 가능하지만 출력 배열이 필요하다.
개선 제안: 현재 구현이 적절해 보입니다.
💡 풀이에 시간/공간 복잡도를 주석으로 남겨보세요!
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Hash Map / Hash Set, Dynamic Programming
- 설명: 해당 코드는 문자 빈도를 해시 맵(Counter)로 세고 비교하는 방식으로 애너그램 여부를 판별한다. 두 문자열의 문자 분포를 비교하는 것이 핵심이며, 필요 시 한쪽에서 차감을 통해 확인하는 방식도 사용된다.
📊 시간/공간 복잡도 분석
ℹ️ 이 파일에는 2가지 풀이가 포함되어 있어 각각 분석합니다.
풀이 1: Solution01 — Time: O(n) / Space: O(1)
| 복잡도 | |
|---|---|
| Time | O(n) |
| Space | O(1) |
피드백: Counter 기반으로 초기화와 차감 단계로 애너그램 여부를 판단한다. 길이가 다르면 빠르게 걸러진다.
개선 제안: 현재 구현이 적절해 보입니다.
풀이 2: Solution — Time: O(n) / Space: O(1)
| 복잡도 | |
|---|---|
| Time | O(n) |
| Space | O(1) |
피드백: Counter 객체를 사용해 두 문자열의 빈도수를 바로 비교한다.
개선 제안: 현재 구현이 적절해 보입니다.
💡 풀이에 시간/공간 복잡도를 주석으로 남겨보세요!
| answer[j] *= suffix | ||
| suffix *= nums[j] | ||
|
|
||
| return answer |
There was a problem hiding this comment.
시간이 얼마 안 남아서 남은 것들 후딱 풀겠습니다. 늦은 시간인데도 확인해주셔서 감사해요ㅠㅠ!

답안 제출 문제
작성자 체크 리스트
In Review로 설정해주세요.검토자 체크 리스트
Important
본인 답안 제출 뿐만 아니라 다른 분 PR 하나 이상을 반드시 검토를 해주셔야 합니다!