강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của wannabeing
wannabeing

câu hỏi đã được viết

Lõi kiểm tra mã hóa cho người mới bắt đầu (lý thuyết và giải quyết vấn đề) [Python]

[Bài toán số 6] Tổng của hai số : O(n)

두수의합 Counter 사용

Viết

·

156

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
python코딩-테스트

Câu trả lời 2

1

codingcamp님의 프로필 이미지
codingcamp
Người chia sẻ kiến thức

안녕하세요^^

위 코드로 하면 아래 인프런 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
Người đặt câu hỏi

감사합니다~!

1

안녕하세요, 인프런 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 두수의 합(해시) 질문에서 해시테이블을 사용하여 두 수의 합 문제를 해결하는 방법과 유사한 논의를 확인해 보세요.

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

Hình ảnh hồ sơ của wannabeing
wannabeing

câu hỏi đã được viết

Đặt câu hỏi