티스토리 뷰
반응형
두 수의 합
- 덧셈하여 타겟을 만들 수 있는 배열의 두 숫자 인덱스를 리턴하라
- 입력 => nums = [2, 7, 11, 15], target = 9
- 출력 => [0,1]
풀이 1 : 브루트 포스(Brute Force)
- 모든 경우를 전부 탐색한다.
1
2
3
4
5
|
def solution(nums:list, target:int) -> list:
for i in range(len(nums)-1):
for j in range(i+1,len(nums)):
if nums[i] + nums[j] == target:
return [i, j]
|
cs |
- O(N^2)의 속도
풀이 2 : in 연산 사용
- in을 이용한 탐색
1
2
3
4
5
6
|
def solution(nums:list, target:int) -> list:
for i, val in enumerate(nums):
complement = target - val
if complement in nums[i+1:]:
return i, nums[i+1:].index(complement) + (i+1)
# nums에서 전체 검색을 하는 index가 아니라 찾은 곳에서 index를 찾고 다시 i+1을 더함
|
cs |
- Brute Force와 같은 O(N^2)이지만 연산 속도는 풀이 1보다 훨씬 빠르다. O 표기법으로 표현 되지 않는 속도 차이가 존재한다.
풀이 3 : 딕셔너리 사용
1
2
3
4
5
6
7
|
def solution(nums:list, target:int) -> list:
nums_maps = {}
for i, val in enumerate(nums): # val를 key, index를 value로 딕셔너리
nums_maps[val] = i
for i, val in enumerate(nums):
if target-val in nums_maps and i != nums_maps[target-val]:
return i, nums_maps[target-val]
|
cs |
- 타겟에서 첫 번째 수를 빼면 두 번째 수를 바로 알아낼 수 있다. 그렇다면 두 번째 수를 키로 하고 기존의 인덱스는 값으로 바꿔서 딕셔너리로 저장하면 나중에 두 번째 수를 키로 조회해서 정답을 즉시 찾아낼 수 있다.
- O(N)
풀이 4 : 풀이 3의 딕셔너리 2개를 1개로 합치기
1
2
3
4
5
6
7
8
|
def solution(nums:list, target:int) -> list:
nums_map = {}
for i, val in enumerate(nums):
if target-val in nums_map:
return [nums_map[target-val], i]
# 이미 존재한다는 것은 더 작다는 의미이므로 i가 뒤에 나온다.
nums_map[val] = i
|
cs |
- for문을 하나로 만들어 우선 검사하여 존재하는지 보고, 없을 경우 dict에 내용을 추가한다.
- 속도 차이는 풀이 3과 거의 차이가 없지만 보기에 간결하다.
풀이 5 : 투 포인트(two points)
- 이 문제를 투 포인트로 접근한다면 풀이가 가능하지만 전제조건은 배열이 정렬되어 있어야 한다는 것이다. 배열이 정렬되어있지 않다면 정렬을 우선한다.(O(NlogN)). 문제가 인덱스가 아니라 해당 값을 찾는 것이라면 당연히 이를 통해 해결 가능하다. 하지만 이 문제는 index를 찾는 것이므로 정렬하는 순간 인덱스가 바뀌어 문제가 생긴다. 물론 인덱스를 포함한 튜플 리스트를 만들어 정렬하여 할 수도 있지만 위에 방법보다 느리다.
반응형
'알고리즘 학습 > 파이썬 알고리즘 인터뷰' 카테고리의 다른 글
[파이썬 알고리즘 인터뷰] - LeetCode 15. 3Sum (7장) (0) | 2020.11.23 |
---|---|
[파이썬 알고리즘 인터뷰] - 7장 (배열) - 빗물트래핑 (0) | 2020.11.22 |
[파이썬 알고리즘 인터뷰] - 6장 (문자열 조작) (0) | 2020.11.12 |
[파이썬 알고리즘 인터뷰] - 5장 (리스트, 딕셔너리) (0) | 2020.11.12 |
[파이썬 알고리즘 인터뷰] - 4장 (빅오, 자료형) (0) | 2020.11.09 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Brackets#Stacks and Queues#Codility#Python
- django#slicing
- Distinct#Codility#Python
- 공유기 설치#BOJ#이분탐색#Python
- PassingCars#Codility#Python
- 순열사이클#BOJ#Python
- 백준 알고리즘#BackTracking
- Swift#Tuples#Range
- 암호코드#dp#BOJ#Python
- NumberofDiscIntersections#Codility#Sort#Python
- 랜선자르기#이분탐색#BOJ#Python
- django
- 리모컨#완전탐색#BOJ#Python
- 쿼드트리#BOJ#분할정복#Python
- 반복수열#백준알고리즘#Python
- 미로 탐색#백준알고리즘#Python
- 배열합치기#분할정복#BOJ#Python
- Triangle#Sorting#Codility#Python
- 섬의개수#백준알고리즘#Python
- 파이썬알고리즘인터뷰#4장
- N으로 표현#DP#Programmers#Python
- 날짜 계산#BOJ#완전탐색#Python
- 텀 프로젝트#백준알고리즘#Python
- 종이자르기#분할정복#BOJ#Python
- 토마토#백준알고리즘#Python
- 터틀비치#리콘#xbox#controller
- 병든 나이트#BOJ#탐욕법#Python
- 나무자르기#BOJ#이분탐색#Python
- filter#isalnum#lower
- API#lazy#
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함