CK 016 | Week1 - Day1

This Is Empty.·2021년 9월 13일
0

codekata

목록 보기
16/35

문제

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의 시간이 왔다. 쉬운 문제라고 생각했음에도 불구하고 세명의 팀원 모두 다른 코드로 문제를 풀었다.
역시 알고리즘 푸는 방법에는 답이 정해져있지 않음을 오늘도 느끼게 된다.

profile
Convinced myself, I seek not to convince.

1개의 댓글

comment-user-thumbnail
2021년 9월 14일

정아님 코드 신박하네요 ㅎ target-i는 생각도 못했는데

답글 달기