카테고리 없음
파이썬 코딩테스트 스터디 5주차 #2 - 몸풀기 문제, 두 개의 수로 특정값 만들기
hoony926
2024. 7. 14. 13:34
n개의 양의 정수로 이루어진 리스트 arr와 정수 target이 주어졌을 때
이 중에서 합이 target인 두 수가 arr에 있는지 찾고, 있으면 True
없으면 False 반환하는 solution()함수 작성
제약조건
- n은 2 이상 10,000 이하의 자연수
- arr의 각 원소는 1 이상 10,000 이하의 자연수
- arr의 원소 중 중복되는 원소는 없습니다.
- target은 1 이상, 20,000 이하의 자연수
입출력의 예
arr | target | return |
[1,2,3,4,8] | 6 | True |
[2,4,3,5,9] | 10 | False |
문제 분석하기
1. target+1까지를 index로 하는 value:1,0으로 이루어진 배열 만들기
(왜 target+1이냐면 0+target도 가능하니까)
이때 해당 배열을 돌면서 arr의 값을 인덱스로하는 value=1, 나머지는 다 0
2. arr의 원소를 돌면서 target - 원소가 위에 배열의 인덱스로
value를 1로 가지고 있으면 해당 문제의 조건을 만족함
3. arr의 원소에서 target보다 큰 값은 무시.
아래 문제
소스코드 분석
arr = [1,2,3,4,8]
target = 6
hashtable=[0] *(6+1)
(이렇게 하는 이유는 0+6이 있을수 있으니까)
hashtable = [0,0,0,0,0,0,0]
0이 7개
hashtable
Key | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
Value | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
hashtable[1] = 1
hashtable[2] = 1
hashtable[3] = 1
hashtable[4] = 1
count_sort 함수 실행 후
hashtable
Key | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
Value | 0 | 1 | 1 | 1 | 1 | 0 | 0 |
def count_sort(arr,k):
hashtable = [0] *(k+1)
for num in arr:
if num <= k :
hashtable[num] = 1
return hashtable
def solution(arr,target):
hashtable = count_sort(arr,target)
for num in arr:
# arr =[1,2,3,4,8]
complement = target - num
# num = 1, complement = 6 - 1 = 5
# num = 2, complement = 6 - 2 = 4
# num = 3, complement = 6 - 3 = 3
# num = 4, complement = 6 - 4 = 2
# num = 8, complement = 6 - 8 = -2
if (
complement != num
and complement >=0
and complement <=target
and hashtable[complement] = 1
):
return True
return false
좀 헷갈리지만,
얼추 이해는 감.
근데 처음부터 작성하기가 좀 어려울듯..
♬ 자료 출처 - 책
코딩 테스트 합격자 되기 - 파이썬 편
이 포스팅의 모든 내용은 해당 책의 내용을 바탕으로 하고 있습니다.
감사합니다.