문제 출처 및 KEYWORDS 분석
Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
You can return the answer in any order.
리트코드(LeetCode) 웹사이트에 있는 1번 문제로써 이 문제를 풀 때 중요한 KEYWORDS는 아래와 같다.
- array of integers nums
- an integer target
- return indices
- input would have one solution
- not use the same element twice
첫 번째 키워드는 정수형 배열 'nums', 두 번째 키워드는 단일 정수형 변수 target 그리고 이 문제에서 요구하는 것은 nums array의 element들을 더해 target의 숫자와 일치하는 element의 index값들을 리스트 형태로 리턴해야 한다. 여기서 세 번째 키워드인 indices는 리스트의 index들을 가리킨다. Easy level의 1번 문제임에도 불구하고 기본적으로 class, function, for loop 등 기본적인 syntax 문법들은 반드시 알고 있어야 풀 수 있는 문제이다.
Solution
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(len(nums)):
for j in range(i+1,len(nums)):
if nums[i]+nums[j]==target:
return [i,j]
Explanation
처음 LeetCode 문제를 풀어보게 되면 아마 Python3 카테고리를 선택 시 기본적으로 class와 def 함수가 있어서 당황하는 사람들이 있을 수 있다. 기본적으로 제공되는 Solution은 클래스의 이름이고 def는 함수를 선언할 때 사용하고 twoSum은 함수의 이름이며 클래스 안에 들어갈 함수를 정의할 때는 그 함수의 매개변수(argument)에 self를 포함시켜야 class 객체를 받을 수 있다. nums: List [int]는 문제에 제시된 것처럼 정수형의 array, 즉 리스트이고, target: int는 정수형(integer) 변수라는 뜻이고 함수의 매개 변수란인 ( ) 안에 적혀있는 이유는 그 변수들을 사용하라는 뜻이다. Python3 카테고리에서 '->List [int]'라고 표시된 이유는 '정수형 리스트를 최종 답으로 리턴 시켜라'라는 뜻이다.
이 문제에서 이중 for loop을 사용한 이유는 위에 키워드 분석에서 4번째, 5번째 키워드 때문이다. 하나의 입력으로 하나의 solution 만 나와야 하며 nums array에 있는 같은 원소를 한 번만 사용해야 하므로 for loop 하나가 돌면서 동시에 원래 시작했던 0번째 index의 원소와는 겹치지 않는 그다음 index의 원소를 검토해야만 한다. 그래서 다른 for loop을 안에서 한번 더 돌릴 수 있도록 이중 for loop을 사용하였다.
range(start, end, step) 함수에서 end를 len(nums)로 지정해주었는데 일반적으로, start, step에 아무것도 지정하지 않는다면 기본값으로 start는 0부터 시작하고 step 은 1로 설정된다. len(object) 함수는 object에 들어가는 것의 개수(예를 들어, 문자열이면 그 캐릭터, 리스트면 그 안의 원소 개수)를 알려준다. nums는 문제에서 제공되는 array of integers 이므로 해당 array에 들어가는 원소의 총개수를 리턴한다. 즉 'i' index로 돌리는 첫 번째 for loop 은 0번째 원소부터 총원소의 개수-1 번째까지 반복문을 돌린다.
첫 번째 for loop 안에 설정한 'j' index로 돌리는 두 번째 for loop은 상위 for loop에서 시작한 원소와 겹치면 안 되기 때문에 range() 함수를 사용할 때 start를 'i+1'부터 시작하는 것이다. 어떤 배열 혹은 리스트 안의 원소를 부르고자 할 때는 arrayName [index of element] 이런 식으로 [] 안에 부르고자 하는 index를 넣어서 호출한다. 호출한 원소들의 합이 target의 숫자와 일치하는지를 찾아야 하므로 조건문 if를 사용하였다. 마지막으로 문제에서 원하는 것처럼 조건을 충족하는 원소의 Indicies를 List 형태로 return 하기 위해 return [i, j]를 사용하였고 twoSum 함수가 리턴한 [i, j]는 Solution 클래스로 넘어가게 된다.
Conclusion
기존의 백 준코 드의 문제들에 비해 초보자 난이도임에도 상대적으로 난도가 있는 LeetCode(리트코드) 1번 문제를 통해 기억해야 할 점들을 정리해보면 아래와 같다.
- 키워드 분석을 통해 문제가 요구하는 조건들을 정확히 만족하도록 코드를 작성하자
- len() 함수를 range(start, end, step)의 end 지점을 설정할 때 사용하자
- list 나 array의 원소를 호출할 때는 arrayName [index of element]
- Python3을 사용할 때는 항상 indentation을 주의하자
- return을 문제에 맞게 사용하자
'Daily 코딩-Python' 카테고리의 다른 글
[파이썬] 백준 2562번(최댓값)-for loop, append(), index() 사용 (0) | 2022.09.29 |
---|---|
[Python3] 백준 10871번 (X보다 작은 수)-list활용법과 for loop (0) | 2022.09.26 |
[파이썬] 백준 11021번(A+B-7)-print()활용법 (0) | 2022.09.24 |
[파이썬] 백준 25304번(영수증)-for loop과 while loop사용 (0) | 2022.09.24 |
[파이썬] 백준 2525번 (오븐시계)-두 가지 풀이방식 (0) | 2022.09.21 |
댓글