[CODE KATA] 배열에서 덧셈 조합 찾기

[Ted's Log] 테드로그·2021년 8월 17일
3

CODE KATA

목록 보기
1/2
post-thumbnail

A code kata is an exercise in programming which helps programmers hone their skills through practice and repetition.
-Wikipedia

문제가 주어졌을 때, 목적지에 어떻게 도착할 수 있을지 고민하고 사고하는 연습을 통해 발전해나가는 모습을 기록으로 남기려고 합니다.

❓   Problem to Solve

  two_sum 함수에 각기 다른 숫자로 구성된 리스트와 target 숫자가 인자로 주어졌을 때, 리스트에서 두개의 숫자를 더해서 target이 되는 조합을 찾아서 해당 조합의 인덱스를 리스트로 반환하는 함수를 만들어라.

[4, 9, 11, 14]과 target으로 13이 주어졌을 때, 
nums[0] + nums[1] = 4 + 9 = 13 이기 때문에
[0, 1]이 return 되어야 한다.

✈️   Navigating to the Goal

  주어진 문제의 세부 조건에서 더해서 target 숫자가 되지 않는 경우는 없다는 것을 확인하고, 따로 조건문을 더해서 처리하는 과정은 배제하고 해답을 고민했다. 배열에서 두 가지 숫자를 선택해서 더하는 과정이 문제 해결의 핵심이기 때문에, 자연스럽게 반복문을 이중으로 도는 logic을 떠올렸다.
 문제 해결 과정을 Pseudo code 형태로 나타낸다면

1. 딕셔너리 형식의 변수를 선언한다.
2. 리스트에서 첫번째 인덱스 요소를 선택한다.
    3. 2번에서 선택된 숫자의 다음 인덱스 요소를 선택한다.
    4. 딕셔너리에 두 수를 더한 값을 key로, 두 수의 인덱스를 리스트로 담아 value로 저장한다. 
    5. 리스트의 마지막 숫자가 나올때까지 3번으로 돌아가서 진행한다.
6. 2번에서 선택한 인덱스 다음 요소를 선택하고 다시 3번으로 진행한다.
7. 만약 리스트의 마지막 인덱스 요소 전까지 순회를 마쳤다면 8번으로 넘어간다.
8. 딕셔너리에서 target을 key로 가지는 value를 반환한다.

😎   Solution

  위의 의사 코드를 python 함수로 구현한 것이 아래의 코드이다.

def two_sum(nums, target):
    my_dict = {}

    for i in range(len(nums) - 1):
        for j in range(i + 1, len(nums)):
            my_dict[nums[i] + nums[j]] = [i, j]

    return my_dict[target]

  함수를 구현하고 나서 느낀점은 리스트나 배열이 주어지고 요소를 비교하거나 정렬하는 문제를 해결하고자 할 때 너무 기계적으로 이중 반복문 형태의 코드를 떠올리게 된다는 점이었다. 조금은 다른 방식으로 문제해결에 접근할 수 있을까라고 고민하고 있을 때 다른 동료의 문제 해결법을 확인할 수 있었다.


💡   Think Differently

  target은 두가지 수의 덧셈으로 산출된다. 따라서 리스트를 반복하여 순회하면서 선택된 요소를 뺐을 때 나오는 값이 리스트에 존재하는지 확인하는 방식으로 함수를 작성할 수 있다.

def two_sum(nums, target):
    result = []
    for num in nums:
        temp = target - num
        if temp in nums:
            result.append(nums.index(num))
            result.append(nums.index(temp))
            break
    return result

👏   Conclusion

  앞으로 포스팅할 Code Kata에 대한 시리즈는 나 혼자서 고민하는 것이 아니라 동료들과 함께 고민한 결과를 다루게 된다. 동료들과 함께하기 때문에 사고의 확장을 경험할 수 있어서 더욱 의미있는 시간이 될 것 같다. 꾸준히 사고하는 힘을 기르다 보면 보다 더 나은 개발자가 될 수 있을 것이라는 희망과 함께 오늘 하루를 마무리 한다.

profile
성장하는 개발자가 되기 위한 발자취 🧑🏻‍💻

0개의 댓글