[파이썬] 프로그래머스 : 타겟 넘버 (Lv.2)
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
0.방향성 생각
- 리스트 길이가 20 이하이다. 2**20 = 10만이라 잡으면 완탐으로도 충분히 가능
1. 중복 순열
from itertools import product as P
def solution(numbers,target):
answer = 0
leng = len(numbers)
for i in P([1, -1], repeat=leng):
if sum(map(lambda x,y: x*y, numbers,i)) == target:
answer += 1
return answer
- (1,-1) 을 중복으로 선택해서 입력 리스트와 길이가 같게 만든 뒤 각 요소를 곱함.(내적)
- 실제 P를 객체에 할당하는거보다 빠르지만 그래도 좀 느린감이 있다.
2. BFS
from collections import deque
def solution(numbers,target):
answer = 0
q = deque([(0,0)])
while q:
x,stage = q.popleft()
if stage == len(numbers) and x == target:
answer += 1
if stage < len(numbers):
for i in (numbers[stage],-numbers[stage]):
q.append((x+i,stage+1))
return answer
- 응애시절에 푼 풀이.
- 리스트 요소를 전부 더한 후, 타겟넘버가 됐으면 +1
3. DFS
def solution(numbers, target):
answer = 0
leng = len(numbers)
def dfs(count,goal):
nonlocal answer
if count == leng:
if goal == target:
answer += 1
return
for i in (numbers[count],-numbers[count]):
dfs(count+1, goal+i)
dfs(0,0)
return answer
- 백준 풀었을 땐, global로 했는데, 함수 내부에서 진행하려고 하다보니까 nonlocal로 써야한다는걸 알았음
- 재귀야 뭐 항상 똑같이. 탈출조건 걸어줘야함.
- 리스트 요소 전부 더했고, 타겟넘버 도달했으면 +1 아닌 경우에는 탈출만 시켜줘서 루프 발생 안하게
코멘트
.
'Algorithm > etc' 카테고리의 다른 글
[파이썬] 백준 1035 : 조각 움직이기 (골드1) (0) | 2023.12.16 |
---|---|
[파이썬] 백준 22945 : 팀 빌딩 (골드4) (0) | 2023.12.12 |
[파이썬] 프로그래머스 : 모음사전 (Lv.2) (0) | 2023.11.30 |
[파이썬] 백준 1405 : 미친로봇 (골드4) (0) | 2023.11.05 |
[파이썬] 백준 1234 : 크리스마스 트리 (골드2) (0) | 2023.11.05 |
[파이썬] 백준 17825 : 주사위 윷놀이 (골드2) (0) | 2023.10.22 |
[파이썬] 백준 14391 : 종이 조각 (골드3) (0) | 2023.10.22 |
댓글