two_sum함수에 숫자 리스트와 '특정 수'를 인자로 넘기면, 더해서 '특정 수'가 나오는 index를 배열에 담아 return해 주세요.
nums: 숫자 배열
target: 두 수를 더해서 나올 수 있는 합계
return: 두 수의 index를 가진 숫자 배열
예를 들어,
nums은 [4, 9, 11, 14]
target은 13
nums[0] + nums[1] = 4 + 9 = 13 이죠?
target으로 보내는 합계의 조합은 배열 전체 중에 2개 밖에 없다고 가정하겠습니다.
from itertools import combinations
def two_sum(nums, target):
# 아래 코드를 작성해주세요.
pair = list(combinations(nums, 2))
for x,y in pair :
if x+y == target:
return [nums.index(x), nums.index(y)]
전에 알고리즘 풀 때 찾아봤던 메소드가 생각나서 적용해보았다.
itertools.combinations는 입력 리스트안의 조합을 순서에 따라 튜플로 반환한다.
다음과 같이 사용할 수 있다.
from itertools import combnations
nums = [4,9,11,14]
pair = list(combinations(nums, 2))
print(pair)
#[(4, 9), (4, 11), (4, 14), (9, 11), (9, 14), (11, 14)]
그렇게 조합된 pair리스트 안에 있는 요소들의 합이 target과 같다면 해당 요소들의 인덱스를 리스트에 담아 리턴한다.
def two_sum(nums, target):
for i in nums:
if target-i in nums:
return [nums.index(i), nums.index(target-i)]
개인적으로 되게 신박했던 코드! 생각지도 못한 방법이였다.
target
에서 i
를 뺀 숫자가 nums
배열에 존재한다면 i
의 인덱스와 target-i
의 인덱스를 반환하면 된다.
def two_sum(nums, target):
for i in nums:
for j in nums:
if i + j == target:
return [nums.index(i), nums.index(j)]
간단한 문제임에도 불구하고 셋 다 다른 코드로 풀어서 약간 재미삼아 누구의 코드가 제일 빠른지 속도를 측정해보았다. 정확하다고 생각은 안하니 그냥 재미로!
나 : (2.6226043701171875e-06, [0, 1])
정아님 : (7.152557373046875e-07, [0, 1])
본욱님 : (9.5367431640625e-07, [0, 1])
드디어 혼자 했던 codekata가 아닌 팀원이랑 진행하는 codekata의 시간이 왔다. 쉬운 문제라고 생각했음에도 불구하고 세명의 팀원 모두 다른 코드로 문제를 풀었다.
역시 알고리즘 푸는 방법에는 답이 정해져있지 않음을 오늘도 느끼게 된다.
정아님 코드 신박하네요 ㅎ target-i는 생각도 못했는데