Q. two_sum
함수에 숫자 리스트와 '특정 수'를 인자로 넘기면, 더해서 '특정 수'가 나오는 index를 배열에 담아 return해 주세요.
nums = [4, 9, 11, 14]
target = 13
#1차
def two_sum (nums, target) :
for num in nums :
if target - num in nums :
break
return [nums.index(num), nums.index(target-num)]
#2차
def two_sum2 (nums, target) :
return [nums.index(x) for x in nums if target-x in nums]
처음에 문제를 딱 봤을 땐 이렇게 생각했다.
1)
두 개의 수를 더한 합계의 모든 경우의 수를 만든다.
2)
target과 일치하는 경우를 찾는다.
3)
2
의 인덱스를 반환한다.
이렇게 코드를 짜기 위해서는 컴퓨터가 모든 경우의 수를 계산해야하며, 1번을 수행하는 코드를 짜기 복잡하다. 또한, 인덱스를 반환하는데 있어 경우의 수에 있는 두 개의 수의 원래 인덱스를 다시 추적해야하는 과정이 필요하다. 결과적으로, 너무 복잡한 방법이라는 생각에 다른 방법을 시도해보기로 했다.
핵심내용은 '뺄셈'을 이용하는 것이다. target에서 리스트 안의 특정 수를 뺀 수가 리스트에 있으면 더했을 때 target이 되는 두 수가 리스트에 있는 것이다.
리스트안의 모든 수를 target과 계산하기 위해서 for
문을, 리스트 안에 특정 수가 존재하는 지 확인하기위해 if
를 사용하기로 했다.
target을 만드는 조합은 1개라고 가정했기 때문에, if
를 만족하는 경우가 있을 때 바로 for
을 멈출 수 있도록 break
를 사용했다.
target = a + b 라고 할 때, target-a = b
target-b = a
의 두가지 식을 만족한다.
예를 들어 , 주어진 리스트에 [a , b , c , d]가 있다고 했을 때, if
문의 조건인 target-a
와 target-b
의 인덱스를 찾는 것과 a
와 b
의 인덱스를 찾는 것은 동일하다.
즉, if
문의 조건만 만족하면 nums.index(a)
와 nums.index(target-a)
를 찾는 것이 아닌 nums.index(a)
와 nums.idex(b)
를 찾으면 되기때문에 for
을 이용해 한 반복에서 두 개의 수의 인덱스를 구할 수 있으며 한 줄로 표현할 수 있다.