박봉달의 개발생활

Algoritm : Two Sum 두 정수의 합 구하기 / append(), 파이썬 화살표 -> 의미 본문

Projects/Algorithm

Algoritm : Two Sum 두 정수의 합 구하기 / append(), 파이썬 화살표 -> 의미

박봉달 2021. 3. 20. 15:02
728x90

오늘부터 알고리즘 공부를 본격적으로 시작해보려고 한다.

내가 공부하는 사이트는 LeetCode 라고 하여 해외의 알고리즘 문제 사이트에서 공부한다.

 

LeetCode - The World's Leading Online Programming Learning Platform

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

다만 주의해야할 점은, 모든 문제가 영어로 이루어져있기 때문에, 이해하지 못하는 단어가 나오면 구글링은 필수! 하면서 내 영어 실력도 늘어가는 것을 느껴가는 요즘이다. 여기서 난이도도 선택할 수 있으며, 나는 아직까지는 초반이기 때문에 Easy 문제들을 해결해가며 쉬운 문제부터 풀어가보고 있다. 언어는 파이썬 Python을 사용하고 있다!


1. 문제 및 사유

문제는 리스트로 nums가 주어지며 정수인 target이 주어진다. 그럼 target 을 만들기 위해 nums 안의 숫자들을 서로 더하여 target의 수를 만들어야 한다. 이 문제를 처음 받았을 때 가장 먼저 들었던 생각은, 그럼 target에서 nums의 1번째 문자를 뺀 값을 nums의 나머지 숫자들과 비교하면 되겠다 라고 생각을 했다. 하지만 나는 파이썬으로 코드를 작성하는 것이 어색했기 때문에 여러번의 구글링이 필요했다.

class Solution:
    def twoSum(self, nums: list[int], target: int) -> list[int]:

우선 코드에서 -> 화살표가 무슨 의미를 하는지 이해하기 어려웠었다. 찾아본 결과, self 는 거의 대부분의 함수를 정의할 때 꼭 들어가는 인자이며, nums : list[int]는 왼쪽부터 차례대로 "변수 : 데이터 타입"을 의미하는 것이었다. 그리고 -> list[int]는 함수의 리턴 값을 리스트 정수형을 반환하겠다는 것을 의미하는 것이었다.

이후 함수를 정의하기 시작했다. 먼저는 수를 list[int]형으로 반환해야하기 때문에 리스트 하나를 sum으로 선언해주었다.

class Solution:
    def twoSum(self, nums: list[int], target: int) -> list[int]:
        sum = []

그리고는 반복문을 활용하여 문자를 하나씩 비교해봐야겠다 생각했다. temp 라는 변수를 만들어 target - nums[i] 번째 데이터를 뺀 값을 저장시켰다. range() 함수는 인자를 어떻게 받냐에 따라 시작값과 끝 값이 달라진다는 것을 배웠다. 그래서 (0, len(nums))을 인자로 넣어주어서 0번째 자리값부터 len(nums) 자리값까지 반복문을 돌리도록 코드를 짰다.

for i in range(0, len(nums)): temp = 0 temp = target - nums[i]

 for i in range(0, len(nums)):
            temp = 0
            temp = target - nums[i]

그리고 그 내부에 반복문을 하나 더 작성하여서, 그 다음 숫자와 비교하는 과정을 작성하였다. 그래서 temp와 동일한 값이 존재하게된다면, break 문을 이용해 반복문을 탈출하도록 작성하였다. 여기서 sum.append() 라는 메서드를 처음 알게 되었는데, 리스트 끝에 값 하나를 넣는 메서드였다. 이를 사용하여 처음에는 nums[i] 값을 넣었는데, 이 문제에서 묻는 것은 그 리스트 안에서의 자리값이기 때문에 자리값을 의미하는 i와 j를 사용하여서 위치값을 배열에다가 넣어주었다!

for i in range(0, len(nums)):
            temp = 0
            temp = target - nums[i]
        
            for j in range(i+1, len(nums)):
                if temp == nums[j] :
                    sum.append(i)
                    sum.append(j)
                    break

그리고 나서 생각해보니 그럼 리스트에 두값이 저장되었으면 어떻게 탈출해야할까? 생각이 들었다. 그러다가 생각했던 것이, 자리값을 넣을 때면 한번에 넣고 내부의 반복문을 탈출하기 때문에, 반복문의 끝에 sum 리스트의 값이 2개가 들어갔으면 다시 반복하지 않게 break를 해주면 되겠다! 라고 생각하여 작성했다!

for i in range(0, len(nums)):
            ...
            if len(sum) == 2 :
                break

이렇게 작성을 하고 제출을 하니 정답이라고 나왔고, 나쁘지.....않은 결과로 테스트를 통과했다! 아무래도 for문이 두번 중첩되다보니 메모리 사용량이 꽤나 높았다. 다음에는 조금 더 간단하게 비교할 수 있는 코드를 작성하는 것이 중요하겠다!

2. 실행 코드

class Solution:
    def twoSum(self, nums: list[int], target: int) -> list[int]:
        sum = []
        
        for i in range(0, len(nums)):
            temp = 0
            temp = target - nums[i]
        
            for j in range(i+1, len(nums)):
                if temp == nums[j] :
                    sum.append(i)
                    sum.append(j)
                    break

            if len(sum) == 2 :
                break
        
        return sum

알고리즘 스터디를 하며 느끼는 점은, 머리로 생각하고 최선의 방법을 찾아 코드를 작성해보는 것도 좋지만, 일단 무작정 코드를 작성하여 돌아가게 해보는 방법도 좋을 것 같다는게 내 의견이다. 뭐든 시도해보면서 여러 방법을 알게되는 것 같다!

728x90
반응형