[Python] (문제풀이) list의 요소를 더하여, 특정 수가 나오면 그 요소 index의 배열 구하기 (Code Kata 1-1)

이태권 (Taekwon Lee)·2022년 6월 7일
0
post-thumbnail

문제❓

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

nums: 숫자 배열
target: 두 수를 더해서 나올 수 있는 합계
return: 두 수의 index를 가진 숫자 배열

예를 들어,

nums은 [4, 9, 11, 14]
target은 13 

nums[0] + nums[1] = 4 + 9 = 13 이죠?

그러면 [0, 1]이 return 되어야 합니다.

문제의 가정

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


접근 방식🤔

  1. nums에서 두 수를 구해야 하므로, 이중 형태의 for 문이 와야 한다.
  2. for 문 안에 if 문을 넣어 두 수를 더해서 원하는 값이 나오면 return 하도록 하자.
  3. 만약 원하는 값이 나오지 않으면 None을 반환하도록 하자.
  4. (문제점) But, 더한 값이 중복되면 어떡하지?
def two_sum(nums, target):
  for i in nums:
    for j in nums:
      if ('조건문'):
        return '원하는 값의 배열'
  return None

답안❗️

우선 팀원과 이야기를 해 보았는데,
중복을 허용하기로 하고 접근을 하였다.

내 답안 (중복 허용 1)

  • 나는 우선 새 List(new_list)를 만든 다음, 원하는 두 수가 나오면
  • append 매서드를 이용하여
  • new_list에 해당 요소의 index를 넣었다.
def two_sum(nums, target):
  new_list = []
  
  for i in nums:
    for j in nums:
      if i + j == target:
        new_list.append(nums.index(i))
        new_list.append(nums.index(j))
        return new_list
   return None

팀원 답안 (중복 허용 2)

  • 팀원 분은 새 List를 만들지 않고,
  • 바로 리턴 값에 [],를 넣었다.
  • 좀 더 직관적이고 짧아서 좋은 것 같다.
def two_sum(nums, target):
  for i in nums:
    for j in nums:
      if i + j == target:
        return [nums.index(i), nums.index(j)]
	return None

중복을 허용하지 않은 답안

답안 1 (중복 미허용 1)

  • 위와는 다르게 for ... in에서 range를 활용했다.
  • 따라서 nums 대신 len(nums)를 썼고,
  • j에 대한 for 문에서 시작점을 0 대신 i+1으로 활용하여
  • j는 항상 i보다 항상 뒤에서 시작되어
  • index가 중복 될 수 없다.
def two_sum(nums, target):
  for i in range(0, len(nums)):
    for j in range(i+1, len(nums)):
	    if nums[i] + nums[j] == target:
	      return [i, j]

답안 2 (중복 미허용 2)

  • 아래는 and 조건을 활용하였다.
  • (주의) index 값뿐만 아니라 요소 값도 달라야 한다.
  • 둘 중 하나만 들어가면 None만 출력된다.
def two_sum(nums, target):
    for i in range(len(nums)):
      for j in range(len(nums)):
        if ((nums[i] + nums[j]) == target) and (nums[i] != nums[j]) and i != j:
            return [i, j]

참고 자료🔖

(Programiz) Python List index()

(Programiz) Python list()

profile
(Backend Dev.) One step at a time

0개의 댓글