코딩테스트[파이썬]/입문자를 위한 코딩테스트 핵심

[해시] - 두 수의 합

softmoca__ 2024. 1. 22. 15:01
목차

두 수의 합

정수 수열 안에서 수열의 원소 두 개의 합이 target값이 되는 경우를 찾고 싶습니다.
매개변수 nums에 길이가 n인 수열이 주어지고, 매개변수 target에 자연수 값이 주어지면

이 수열안에서 두 개의 원소의 합이 정수 target값이 되는 두 원소를 구해 배열에 오름차순으로 담아 반환합니다.
두 개의 원소의 합이 target값이 되는 경우는 오직 한가지 뿐인 입력만 주어집니다. 한 원소를 두 번 더하는 것은 안됩니다.

nums의 각 원소는 유일값입니다.
답이 없을 경우 [0, 0]을 반환합니다.

제한사항:
• nums의 길이 3 <= n <= 200,000
• 배열 nums의 원소는 정수입니다. -10,000 <= nums[i] <= 10,000 • -20,000 <= target <= 20,000

 

나의코드

from collections import defaultdict
def solution(nums, target):
    answer = [0]*2
    dic=defaultdict()
    for x in nums:
        if x in dic:
            answer[0]=x
            answer[1]=target-x
        else:
            dic[target-x]=1
        
    answer.sort()        
    return answer
    
                            
                
print(solution([ 7,3, 2, 13, 9, 15, 8,11], 12))
print(solution([21, 12, 30, 15, 6, 2, 9, 19, 14], 24))
print(solution([12, 18, 5, 8, 21, 27, 22, 25, 16, 2], 28))
print(solution([11, 17, 6, 8, 21, 9, 19, 12, 25, 16, 2], 26))
print(solution([7, 5, 12, -9, -12, 22, -30, -35, -21], -14))
print(solution([7, 5, 12, 20], 15))

오.. 해시를 배우니 반복문 하나로 해당 출력값을 구할수 있다..!

해시가 저장소(?) 같은 역활을 해서 그렇다.

 

정답코드

from collections import defaultdict
def solution(nums, target):
    answer = [0]*2
    nH = defaultdict(int)
    for x in nums:
        y = target - x
        if y in nH:
            return sorted([x, y])
        nH[x] = 1
        
    return answer
    
                            
                
print(solution([3, 7, 2, 12, 9, 15, 8], 12))
print(solution([21, 12, 30, 15, 6, 2, 9, 19, 14], 24))
print(solution([12, 18, 5, 8, 21, 27, 22, 25, 16, 2], 28))
print(solution([11, 17, 6, 8, 21, 9, 19, 12, 25, 16, 2], 26))
print(solution([7, 5, 12, -9, -12, 22, -30, -35, -21], -14))
print(solution([7, 5, 12, 20], 15))