1. 문제
*숫자들의 순서는 고정되어 있다고 생각해야 함.
2. 풀이 과정
방법 1)
1. 배열 정렬하기 => 필요 없는 연산 줄이기 위함
2. 초기설정 : Q를 초기화해 주는 것, 현재 index가 i인 값이 음수가 되어도 좌항의 합이 target값보다 크거나 같은 값만 Q에 넣는다.
3. Q에서 element를 하나 꺼내고 그 element에 기록된 index의 뒤의 값들이 또 음수가 되어도 좌항의 합이 target값보다 크거나 같은 값만 Q에 넣어준다.
4. Q의 element는 (음수 처리한 마지막 인덱스 값, 좌항의 합)로 구성되는데, 좌항의 합이 target이면 결과로 출력할 count += 1을 하고 다음 요소를 처리하러 간다.
from collections import deque
def solution(numbers, target):
l =len(numbers)
numbers.sort()
total = sum(numbers)
Q = deque() #index, 선택한 수의 배열
#초기 설정
for i in range(l):
if total - 2 * numbers[i] < target: #음수로 바꾸기 = 두 번빼야함
break
Q.append((i, total - 2*numbers[i]))
#
result = 0
while Q:
idx, t = Q.popleft()
if t == target:
result += 1
continue
for i in range(idx+1, l):
if t - 2*numbers[i] >= target:
Q.append((i, t - 2*numbers[i]))
return result
방법 2) 코드는 간결하나, 실행 시간은 방법 1)이 3배 빠르다.
def solution(numbers, target):
# 종료 조건
# 결과는 좌항, 우항이 같아야 하므로, 좌항을 우항으로 모두 넘겼을 때 target = 0
if not numbers and target == 0:
return 1
elif not numbers:
return 0
#배열의 첫 번째 인자가 양수일 때 + 음수일 때
return solution(numbers[1:], target - numbers[0]) + solution(numbers[1:], target + numbers[0])
'코딩문제풀이 > 프로그래머스' 카테고리의 다른 글
[Python] 디스크 컨트롤 (0) | 2021.08.29 |
---|---|
[Python] 베스트앨범 (0) | 2021.08.29 |
[Python] 구명보트 (0) | 2021.08.28 |
[Python] 큰 수 만들기 (0) | 2021.08.28 |
[Python] 조이스틱 (0) | 2021.08.28 |