leetcode:two sum

태훈입니다·2023년 3월 28일
0

코테 풀이

목록 보기
34/34

백준이 아닌 leetcode 문제 two sum을 풀어보았다!

문제는 유명한데, nums라는 배열에서 2가지의 숫자의 합이 target이 될 경우,
그nums 숫자들 인덱스를 출력하면 되는 문제였다.

정답 코드:

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        result = []
        # A = target - nums[i]
        for i in range(0,len(nums)):
            if (target - nums[i]) in nums and (target - nums[i]) * 2 != target:
                result.append(i)
            elif (target - nums[i]) * 2 == target and nums.count(nums[i]) > 1:
                result.append(i)
            


        return result

먼저 result 라는 리스트를 만들어두고,
for문을 이용해서 범위를 0부터 nums의 길이까지로 설정했다.
(여기서 처음에 for i in nums: 로 했다가, nums=[3,3]과 같은 배열이 나올 때
index(i)로 해당 인덱스를 찾으려해도, 가장 처음 인덱스만 출력돼버려서 [0,0]이 output 됐고, 헤메버렸다..)
그 뒤 조건문으로 2가지의 조건을 설정했는데,
하나는 타겟에서 0부터 끝까지의 배열 안 숫자들을 뺐을 때,
뺀 숫자가 nums 배열에 존재한다면, 그 인덱스를 객체에 넣는 방법을 썼다.
이 조건에서 중요한 건 만약 [3,4,5] 타겟 = 6 과같은 배열이 나오면
6 - 3 은 3이어서 nums 안에 존재해버리는데, 문제에서 원하는 건 2가지의 수의 합이기에
예외처리를 위해서 해당 인덱스 * 2 가 타겟일 경우엔, if 문을 통과하지 못하도록 했다.
이럴 경우 [3,3,5] 타겟 = 6 인 경우엔 통과를 못하지만 [0,1] 이 나와야 정상인데,
이 경우에도 elif 문에 count 로 숫자를 파악해서 , 만약 숫자가 1보다 크다면, 해당 인덱스를 포함하도록 하여서 정답을 만들었다..

허접한 나의 코드보다 좋은 코드들을 보면

class Solution(object):
    def twoSum(self, nums, target):
        for i in range(len(nums)):
            for j in range(i+1, len(nums)):
                if nums[i] + nums[j] == target:
                    return [i,j]

위와 같은데, 간단하면서도 2중포문을 써도 내 runtime 보다 짧다는 것에서
공부가 되었다.
코드를 이해해보자면 나처럼 len(nums) 를 범위로 for문을 돌리고, j 엔 2번째 인덱스부터 반복문을 돌려서,
예제 [3,3,4] 타겟 =6 같은 경우
3+3 = 6 가 맞으니 [0,1] 이 출력되게 하는 간단한 답이었다.
내 코드는 조건이 너무 많이 붙어서 그런지 런타임이 약 3ms 정도 지연됐다..
조금 더 간단한 방법을 찾을 수 있는 컴퓨터적 사고를 해야겠다..

profile
개발 공부를 하고 있는 비전공자입니다!

0개의 댓글