데이터사이언스 기록기📚

[프로그래머스] Level 2_타겟넘버(BFS/DFS) 본문

Coding Test/프로그래머스(Python)

[프로그래머스] Level 2_타겟넘버(BFS/DFS)

syunze 2022. 10. 3. 20:24

📌문제유형

BFS/DFS

 

📌문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📌나의 문제풀이

- 하단의 문제풀이로 풀이

  • tmp에 양수, 음수 모든 경우의 수로 숫자 더해서 넣기
  • tmp를 leaves에 대입
  • leaves를 탐색하며 target과 맞는지 확인
 

프로그래머스 - 타겟 넘버 (DFS, BFS) Python

문제 설명 n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다. `1+1+1+1+1

velog.io

#BFS 풀이
def solution(numbers, target):
    answer = 0
    leaves = [0]
    
    # 모든 경우의 수 다 더하는 것
    for num in numbers:
        tmp = []
        for parent in leaves:
            tmp.append(parent + num)    # 양수로 tmp에 넣기
            tmp.append(parent - num)    # 음수로 tmp에 넣기
        leaves = tmp    # leaves를 tmp로 대체
        
    # 모든 경우의 수가 target과 맞는지 확인
    for leaf in leaves:
        if leaf == target:
            answer += 1
            
    return answer

 

📌다른 사람의 문제풀이

1) 재귀 사용

def solution(numbers, target):
    if not numbers and target == 0 :
        return 1
    elif not numbers:
        return 0
    else:
        return solution(numbers[1:], target-numbers[0]) + solution(numbers[1:], target+numbers[0])

 

2) product(데카르트 곱)을 이용한 풀이

  •  product : DB의 join과 유사
    • 두 개 이상 리스트의 모든 조합을 구할 때 사용
  • map : 여러 개의 데이터 -> 한 번에 다른 형태로 변환
    • map(변환 함수, 순회 가능한 데이터)
 

Python 순열, 조합, product - itertools

파이썬으로 코딩할 때, 종종 순열, 조합, product를 구현하거나 사용해야 할 때가 있다. 이럴 때 힘들게 구현하지 말고 파이썬에서 만들어둔 표준 라이브러리인 itertools를 사용해보자조합을 표현할

velog.io

 

 

파이썬 map 내장 함수 사용법 (feat. List Comprehension)

Engineering Blog by Dale Seo

www.daleseo.com

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)

 

3) DFS 이용

 - answer는 global 이용하여 전체 값 바뀌게 하기

answer = 0

def DFS(idx, numbers, target, value):
    global answer
    N = len(numbers)
    if(idx== N and target == value):
        answer += 1
        return
    if(idx == N):
        return
        
    DFS(idx+1,numbers,target,value+numbers[idx])
    DFS(idx+1,numbers,target,value-numbers[idx])
    
def solution(numbers, target):
    global answer
    DFS(0,numbers,target,0)
    return answer

 

📌리뷰

- 전체 경우의 수 따질 때 : BFS, DFS, product(*리스트) 사용하기

728x90
Comments