인프런 커뮤니티 질문&답변

wannabeing님의 프로필 이미지

작성한 질문수

입문자를 위한 코딩테스트 핵심(이론과 문제풀이) [Python]

[문제 6번] 두 수의 합 : O(n)

두수의합 Counter 사용

24.10.17 15:49 작성

·

22

0

안녕하세요

강사님 잘 보고 있습니다!!

아래와 같이 해도 괜찮을까요?

감사합니다~!

from collections import Counter
def solution(nums, target):
    answer = [0]*2
    
    dict = Counter(sorted(nums))
    for i in dict:
       if dict[target-i] == 1:
           return sorted([i, target-i])
    return answer

답변 2

1

김태원님의 프로필 이미지
김태원
지식공유자

2024. 10. 18. 02:38

안녕하세요^^

위 코드로 하면 아래 인프런 AI가 답한 3번 동일한 숫자 고려의 문제가 발생합니다.

즉 같은 숫자를 두 번 사용하는 문제가 발생합니다.

from collections import Counter
def solution(nums, target):
    answer = [0]*2
    
    dict = Counter(sorted(nums))
    for i in dict:
       if dict[target-i] == 1:
           return sorted([i, target-i])
    return answer

print(solution([3, 7, 1, 6, 12, 4, 15, 9], 14))

위를 실행하면 [7, 7]를 답으로 해 같은 숫자를 두 번 사용하는 문제가 발생합니다.

 

 

wannabeing님의 프로필 이미지
wannabeing
질문자

2024. 10. 21. 15:57

감사합니다~!

1

인프런 AI 인턴님의 프로필 이미지

2024. 10. 17. 15:51

안녕하세요, 인프런 AI 인턴입니다.

Counter를 사용해서 두 수의 합 문제를 푸신 점 아주 좋습니다! 코드가 깔끔하네요. 😊 다만, Counter를 사용했을 때 같은 숫자가 두 번 문제에 포함되는 경우를 반드시 처리해야 합니다. 아래에 몇 가지 포인트를 추가적으로 고려해 보시면 좋을 것 같습니다.

  1. Counter로 카운트할 때의 부작용: 주어진 nums 리스트에서 동일한 숫자가 여러 번 등장할 경우, target-i와 동일한 숫자가 등장 횟수가 충분하지 않다는 가정하에 작동할 수 있습니다. 이를 해결하기 위해서는 target의 절반이 되는 숫자가 리스트에 두 번 이상인지 체크해야 합니다.

  2. 정렬 시 주의점: sorted(nums)를 사용하셨는데, sorting은 시간복잡도가 O(n log n)입니다. 이 부분은 문제의 요구사항에서 허용 가능한 시간복잡도에 따라 적절히 사용할 수 있습니다.

  3. 동일한 숫자 고려: 주어진 코드에서는 itarget-i가 동일한 경우 (예: target=4, nums=[2, 2]), dict[target-i]1이라면 이미 사용된 숫자라는 문제를 가질 수 있습니다. 이런 경우에는 추가 조건을 넣어 해결할 수 있습니다.

위의 사항을 보강한 예시를 소개하겠습니다.

from collections import Counter 

def solution(nums, target):
    answer = [0]*2
    dict = Counter(nums) 
 
    for i in dict: 
        complement = target - i 
        if complement in dict:
            # 자기 자신과 같은 경우에는 적어도 숫자가 두 개 있어야 한다.
            if i == complement and dict[i] > 1:
                return sorted([i, complement])
            elif i != complement:
                return sorted([i, complement])
                
    return answer

이 코드는 i 자신이 총합의 일부일 때 Counter에서 요구하는 숫자가 충분한지 확인합니다.

관련하여 강의 3-6 두수의 합(해시) 질문에서 해시테이블을 사용하여 두 수의 합 문제를 해결하는 방법과 유사한 논의를 확인해 보세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.