문제 설명
n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다.
-1+1+1+1+1 = 3
+1-1+1+1+1 = 3
+1+1-1+1+1 = 3
+1+1+1-1+1 = 3
+1+1+1+1-1 = 3
사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 return 하도록 solution 함수를 작성해주세요.
제한사항
- 주어지는 숫자의 개수는 2개 이상 20개 이하입니다.
- 각 숫자는 1 이상 50 이하인 자연수입니다.
- 타겟 넘버는 1 이상 1000 이하인 자연수입니다.
입출력 예
numbers | target | return |
[1, 1, 1, 1, 1] | 3 | 5 |
입출력 예 설명
문제에 나온 예와 같습니다.
나의 풀이
[Python(파이썬)]
def solution(numbers, target):
from itertools import combinations
sumlist = sum(numbers)
a = []
if (sumlist - target) % 2 == 0:
minus = int((sumlist - target) / 2)
for i in range(1, len(numbers)+1):
a = a + list(combinations(numbers, i))
for j in range(len(a)):
a[j] = sum(a[j])
return a.count(minus)
else: return 0
학습한 내용
나의 풀이로 풀면서 정확성은 맞지만 아무래도 시간적인 면에서 비효율적이지 않을까 생각은 했다.
역시나 문제를 통과는 했지만 테스트 1, 2를 보았을때 시간이 많이 걸렸다. 그래서 더 나은 방법을 학습하기 위해 아래 코드를 보았다.
# 다른 사람 코드
# 튜플(x, -x), product, map을 이용해서 풀었다.
from itertools import product
def solution(numbers, target):
l = [(x, -x) for x in numbers]
s = list(map(sum, product(*l)))
return s.count(target)
나는 조합을 사용했지만 위의 코드는 product, 튜플(x, -x), map을 이용하여 풀었다. .
product = 데카르트 곱(cartesian product)
집합 A의 원소 a와 집합 B의 원소 b를 순서대로 벌여 놓고 괄호로 묶은 순서쌍 (a,b) 전체의 집합
- 파이썬 순열, 조합, product를 학습하여 아래 링크와 같이 정리했다.
[Python] 순열과 조합
순열(Permutataion) 서로 다른 n개 중에서 r개를 취하여 그들을 일렬로 세울 때, 하나하나를 n개 중에서 r개 취한 순열 (= 서로 다른 n 개 중 r 개를 골라 순서를 고려해 나열한 경우의 수) # 파이썬에서
young-library.tistory.com
순열 - 서로 다른 n 개 중 r 개를 골라 순서를 고려해 나열한 경우의 수
조합 - 서로 다른 n개 중에서 r개(n>=r)취하여 조를 만들 때, 이 하나하나의 조를 n개 중에서 r개 취한 조합 -> 순서 필요 없다.
문제 출처
코딩테스트 연습 - 타겟 넘버
n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다. -1+1+1+1+1 = 3 +1-1+1+1+
programmers.co.kr
'[Python] Programmers > Level2' 카테고리의 다른 글
[프로그래머스/Level2] 기능 개발 (0) | 2021.07.07 |
---|---|
[프로그래머스/Level2] 오픈채팅방 (2019 카카오 블라인드) (0) | 2021.07.06 |
[프로그래머스/Level2] 멀쩡한 사각형 (대각선에 잘린 사각형) (0) | 2021.07.05 |
[프로그래머스/Level2] 124 나라의 숫자 (0) | 2021.07.03 |
[프로그래머스/Level2] 짝지어 제거하기 (2개의 같은 문자 제거) (0) | 2021.07.02 |
댓글