알고리즘 고득점 키트 BFS/DFS lv2 타겟넘버
숫자 배열이 주어지고, 목표 값이 있음
각 숫자를 더하거나 빼서 목표 값을 만들고, 총 목표 값을 몇 가지로 만들 수 있는지 return하면 됨
혼자 못풀었음
풀이 참고함
BFS 풀이
모든 연산을 저장하는 leaves 배열이 존재
for문을 돌며 각 숫자를 탐색
leaves 안에 있는 모든 숫자들에 대해서, 현재 숫자를 더하거나 뺀 값을 임시 배열에 저장함
leaves 배열 값을 임시 배열값으로 치환함
#어차피 숫자 순서를 바꾸거나 하는 일은 없으니까
#순서대로 각 숫자를 더하거나 뺐을 때 경우를 다 저장해서 나중에 target 값인지만 확인하면 됨
for문 돌며 leaves안에 있는 값 살펴봄. target값이면 answer +1
def solution(numbers, target):
answer = 0
leaves =[0]
for num in numbers:
tmp = []
for parent in leaves:
tmp.append(parent-num)
tmp.append(parent+num)
leaves=tmp
for i in leaves:
if i==target:
answer+=1
return answer
DFS 풀이
일단 depth 0에서 시작해서, depth를 증가시켜가며 재귀함수를 실행함
depth가 numbers 길이와 같아지기 전까지, 각 numbers의 요소에 -1을 곱한 값을 재귀함수에 계속 집어넣음
-> 각 자리에 부호를 + 또는 -로 직접 실험해보는 것과 같음
계속 그렇게 배열을 만들다가, depth가 numbers의 길이와 같아지면
-> 각 자리에 부호를 집어넣는 작업을 다 끝냈다는 뜻, 그럼 모든 숫자의 합을 구해서 target값이랑 일치하는지 비교
-> 일치하면 answer에 더해줄 값을 1로 return 아니면, answer에 더해줄 값을 0으로 return
def solution(numbers, target):
answer = DFS(numbers, target, 0)
return answer
def DFS(numbers, target, depth):
answer = 0
if depth == len(numbers):
# print(numbers)
if sum(numbers) == target:
return 1
else:
return 0
else:
answer += DFS(numbers, target, depth+1)
print(numbers)
numbers[depth] *= -1
answer += DFS(numbers, target, depth+1)
print(numbers)
return answer
참고 출처
'개발자 강화 > 코딩 테스트' 카테고리의 다른 글
[프로그래머스] 소수 찾기 - 완전탐색 (C++) (0) | 2024.11.06 |
---|---|
[프로그래머스] 최소직사각형 - 완전탐색 (c++) (0) | 2024.11.06 |
[프로그래머스] 조이스틱 - Greedy (0) | 2024.10.23 |
[프로그래머스] 구명보트-Greedy (0) | 2024.10.23 |
[완전탐색-1주][백준] 1254 - 팰린드롬 만들기[실2] (0) | 2024.09.10 |