일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 몽골
- 테를지국립공원
- 백준
- algorithm
- 울란바토르
- 소프트웨어 아카데미
- 여행
- 초원
- 헬스
- 몽골요리
- 월드프렌즈 ICT 봉사단
- 칭기스칸 동상
- 아부다비
- 알고리즘
- LG글로벌챌린저
- 파이썬
- ICT봉사단
- 칭기즈칸
- 테를지
- 교환학생
- 몽골 헬스장
- 코로나
- 게르
- 한 줄로 서기
- 독일
- 몽골 고기
- 월드프렌즈
- 담슈타트
- SWEA
- Python
Archives
- Today
- Total
맛있는물회
[맛있는물회] <programmers 알고리즘> "타겟 넘버" 본문
문제 조건
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 함수를 작성해주세요.
Input
- 주어지는 숫자의 개수는 2개 이상 20개 이하입니다.
- 각 숫자는 1 이상 50 이하인 자연수입니다.
- 타겟 넘버는 1 이상 1000 이하인 자연수입니다.
Output
생각한 아이디어
연산자의 개수와 N의 값이 그렇게 크지 않기 때문에 단순하게 순열 조합을 사용하자 라는 아이디어를 적용하였다.
순열이 필요한데 중복 순열이기 때문에 product라는 함수를 사용하였고 아주 간단하게 풀 수 있었다.
DFS로 푼다면 조금 생각할 부분이 꽤 있었겠지만 중복 순열 함수를 사용하여 아주 직관적으로 풀었다.
소스코드
from itertools import product
cnt = 0
def cal(numbers,op,target):
global cnt
sum = 0
for i in range(0,len(numbers)):
if op[i] == 0: #+
sum += numbers[i]
elif op[i] == 1: #-
sum -= numbers[i]
if sum == target:
cnt+=1
def solution(numbers, target):
op = [0,1]
for val in product(op,repeat = len(numbers)):
#print(val)
cal(numbers,val,target)
print(cnt)
return cnt
*파이썬 문법 정리
'IT > 알고리즘' 카테고리의 다른 글
[맛있는물회] <백준 알고리즘> 14502번 "연구소" (0) | 2020.04.16 |
---|---|
[맛있는물회] <programmers 알고리즘> "숫자 야구" (0) | 2020.04.15 |
[맛있는물회] <programmers 알고리즘> "N으로 표현" (0) | 2020.04.15 |
[맛있는물회] <백준 알고리즘> 10844번 "쉬운 계단 수" (0) | 2020.04.08 |
[맛있는물회] <SWEA알고리즘> 4880번 "토너먼트 카드게임" (0) | 2020.04.07 |
Comments