codekata 1. two_sum

rahula·2021년 6월 21일
0

algorithm

목록 보기
1/9

two_sum함수에 숫자 리스트와 '특정 수'를 인자로 넘기면, 더해서 '특정 수'가 나오는 index를 배열에 담아 return해 주세요.

문제 파악

문제 : 리스트에서 두 값의 합이 특정 조건을 만족하는 경우를 찾고, 그 순서값을 반환해라.

조건 : target으로 보내는 합계의 조합은 배열 전체 중에 2개 밖에 없다고 가정하겠습니다.

인풋 : 리스트와 특정 수

아웃풋 : 더해서 특정 수가 되는 두 요소의 index(리스트)

생각 과정

  1. 리스트의 모든 요소들에 대해서 반복하는 과정이 생긴다.
    따라서 반복문이 하나 필요하다.
  2. 다른 요소와 하나하나 매칭시켜서 연산(합)해야 한다.
    따라서 반복문이 하나 더 필요하다.
  3. 특정 조건을 만족시키는지 여부를 확인해야 한다.
    따라서 조건문이 필요하다.(두번째 반복문 안에서)
  4. 조건을 만족한다면, 해당 요소가 리스트에서 차지하는 순서를 반환해야 한다.
    따라서 index를 쓰거나, 처음부터 range함수로 iterate해야 한다.
  5. 그런데 이미 합한 쌍을 또 매칭시키는 것은 비효율적이므로, range의 시작점을 i+1로 한다.

첫번째 방법 : 반복문 2개와 range, i + 1

def two_sum(nums, target):
    for i in range(len(nums)):
        for j in range(i + 1, len(nums)):
            print(i, j)
            if nums[i] + nums[j] == target:
                return [i, j]

두번째 방법 : 반복문 2개와 index메서드

def two_sum(nums, target):
    for i in nums:
        for j in nums:
            print(i, j)
            if i + j == target:
                return [nums.index(i), nums.index(j)]

세번째 방법 : 반복문 1개와, 뺀 값을 찾기

문제에서 요구하는 것에만 집중한다면, 반복문을 2개 쓰는 대신에 각각을 target에서 뺀 값을 리스트에서 찾는 것이 더 효율적이다. (과연 효율적인가? 그건 더 알아봐야겠다.)

def two_sum(nums, target):
    for i in range(len(nums)):
        print([4, 9, 11, 14].count(target - nums[i]))
        remain = target - nums[i]
        if nums.count(remain):
            return [i, nums.index(remain)]

네번째 방법 : hash개념 이용하기

def two_sum(nums, target):
    seen = {}
    for i, num in enumerate(nums):
        if target - num in seen:
            return [i, seen[target - num]]
        else:
            seen[num] = i

생각과 질문

  1. 문제를 파악하는 데에 시간을 쓰자. 생각없이 코드부터 치는건 금지.
  2. hash 개념이란?
  3. 파이썬의 iterate란?
  4. 뭐가 가장 효율적인 코드일까?
  5. count나 index등의 메소드들은 반복문을 포함하고 있는거 아닌가? 그러면 최소한으로 줄이려고 해야 한다.
profile
백엔드 지망 대학생

0개의 댓글