TIL 12. CodeKata week 1 -1

요니·2021년 10월 24일

Algorithm

목록 보기
1/4
post-thumbnail

CodeKata 1.

two_sum함수에 숫자 리스트와 '특정 수'를 인자로 넘기면, 더해서 '특정 수'가 나오는 index를 배열에 담아 return해 주세요.
(target으로 보내는 합계의 조합은 배열 전체 중에 2개 밖에 없다고 가정)

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

예를 들어,
nums은 [4, 9, 11, 14]
target은 13

nums[0] + nums[1] = 4 + 9 = 13

Solution

나의 Solution 👀

나는 이중 for문을 이용하여 숫자 리스트에서 두 개의 수를 뽑고 해당 수의 합과 target으로 주어진 수가 일치하는지 확인하여 반환하기로 했다.

def two_sum(nums, target):
    for i in range(0, len(nums)-1):
    	for j in range(i+1, len(nums)):
            if nums[i] + nums[j] == target:
            	return [i, j]
                
nums = [4, 9, 11, 14]
target = 13

print(two_sum(nums, target))
> [0, 1]

그 이외의 Solution 👀

1. 표준 라이브러리인 itertools 이용하기
Python에서 만들어둔 표준 라이브러리인 itertools의 combinations를 이용하면 중복을 허용하지 않고 모든 경우의 수를 구할 수 있었다.

from itertools import combinations
def two_sum(nums, target):
    combinated = list(combinations(nums, 2))
    for i in combinated:
    	if i[0] + i[1] == target:
	   return [nums.index(i[0]), nums.index(i[1])]

2. 리스트 컴프리헨션 이용하기

내가 생각했던 이중 for문 방법과 유사하나 리스트 컴프리헨션이라는 방법이 있다는 것을 알게되었다.

리스트 컴프리헨션으로 작성한 코드는 간결하고 데이터베이스를 조회하여 리스트로 만들 때 많이 사용된다.

코드마다, 기계마다 정확한 시간은 다르겠지만 일반적인 반복문을 사용하였을 때보다 리스트 컴프리헨션이 코드 실행시간을 줄일 수 있어 데이터 양이 많을 때 좀 더 효율적이다.

그러나, 성능개선을 하기 위해 리스트 컴프리헨션을 사용하기도 하지만 모든 상황에서 만능은 아니다. 예를 들어 코드의 가독성을 위해서는 여러 줄의 표현식과 조건문으로 표현하는 것이 이중 for문의 복잡한 리스트 컴프리헨션 한줄로 코딩하는 것보다 나은 경우도 있으니 코딩을 할 때 어느 쪽이 더 좋을지 고민이 필요할 것 같다.

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

3. 생각의 전환하기
나는 nums의 요소를 더해서 target 값을 만들어낼 생각만 하고반대로 target에서 하나의 nums 값을 뺀 수가 nums 안에 있는 경우를 생각하지 못했다.

문제를 풀고 나서 나중에 다시 한번 생각하며 여러가지 방법들로 풀어보는 시간을 가지니 좋은 것 같다.

def two_sum(nums, target):
    for num in nums:
        if (target - num) in nums:
            return [nums.index(num), nums.index(target-num)]

참고 문헌
데이터 과학을 위한 파이썬 프로그래밍
https://url.kr/jdh2v7

profile
내가 나여서 빛이나기 위해😊

0개의 댓글