• 분류 전체보기 (512)
    • 개발남노씨(Coding Test) (6)
    • 고농축 백엔드 (17)
    • 재귀함수 DFS 총정리 (1)
    • 프론트엔드 날개달기:Vuejs.React (1)
    • 훈훈한 javascript (5)
    • 렛츠기릿 자바스크립트 (18)
    • 나도코딩 (1)
      • 웹 스크래핑 (1)
    • 프로그래머스(자바스크립트) (41)
      • LV.0(자바스크립트) (41)
    • 프로그래머스(자바) (121)
      • LV.0(자바) (56)
      • LV.1(자바) (41)
      • LV.2(자바) (23)
    • 프로그래머스(파이썬) (127)
      • LV.0(파이썬) (46)
      • LV.1(파이썬) (51)
      • LV.2(파이썬) (30)
    • 임시저장소 (31)
    • 프로젝트 (0)
    • 자바 알고리즘 (13)
      • 알고리즘 직빵 자바 문법 (10)
      • String(문자열) (3)
    • 파이썬 알고리즘 (93)
      • 알고리즘 직빵 파이썬 문법 (20)
      • 알고리즘 백준 (2)
      • 파이썬 알고리즘(사고력기르기) (6)
      • 파이썬 탐색 & 시물레이션 (8)
      • 이분탐색 & 그리디 알고리즘 (10)
      • 스택, 큐, 해쉬, 힙 (10)
      • 완전탐색과 DFS기초 (12)
      • DFS, BFS 활용 (19)
      • 동적계획법 (6)
    • 자바 (27)
      • Java TPC(생각하고, 표현하고, 코딩하고) (17)
      • Java (중요하고, 이해 안 되고, 어려운) (10)
    • 스프링 (5)
      • 스프링 MVC 패턴 2편 (5)
hELLO · Designed By 정상우.
@@#@@

기록용 블로그

프로그래머스(파이썬)/LV.2(파이썬)

타켓넘버→ DFS(깊이우선탐색)★★+요소 더하기, 요소 빼기+ 재귀함수

2022. 12. 30. 11:53

나의 틀린 풀이

def solution(numbers, target):
    return DFS(0, 0, target, 0)
   
   

def DFS(L, sum, target, cnt):
  if L ==len(numbers):
      if sum == target:
           cnt+=1
           return cnt
  else:
     DFS(L+1, sum-numbers[L], target, cnt)
     DFS(L+1, sum+numbers[L], target, cnt)

 

numbers = [4, 1, 2, 1]
target = 4


print(solution(numbers, target))

 

 

 

 

성공한 나의 풀이 

def solution(numbers, target):
    def DFS(L, sum, target, cnt):
        if L ==len(numbers):
            if sum == target:
                cnt+=1
        else:
            cnt = DFS(L+1, sum-numbers[L], target, cnt)
            cnt = DFS(L+1, sum+numbers[L], target, cnt)
        return cnt

    return DFS(0, 0, target, 0) #return으로 함수를 종료하는 것이 아니라 다른 함수를 호출한다.
   

numbers = [4, 1, 2, 1]
target = 4

print(solution(numbers, target))

 

 

▶ cnt의 값을 계속 갱신시키지 않고, 반영된 값을 끌고 가려면,

     DFS의 리턴값으로 받아줘야 끌고 다닐수 있다. 

 
▶ 그리고 마지막 줄에서 최종값으로 DFS에서 return을 해줘야 계속 DFS탐색을 하면서 cnt값을 끌고 간다.  

 

▶ target같은 경우 항상 같은 값이어야 하므로 별도의 조치를 취하지 않는다. 

 

▶ 다만, sum의 경우 numbers의 요소를 더해서 값을 누적시켜야 되므로

    sum-numbers[L] 또는 sum+numbers[L]를 해서 값을 누적시켜 나간다. 

 

 

▶ 재귀 타고 들어가서 젤 안쪽 함수에서 리턴하더라도

     바로 바깥쪽 함수가 받는거지 젤 바깥 쪽 함수가 받는게 아니다.

 

"구슬을 나누는 경우의 수"를 보면 

solution()함수의 리턴값을 result로 받아주고,

마지막 줄에서 return result하고 있다. 

https://copro505.tistory.com/entry/%EA%B5%AC%EC%8A%AC%EC%9D%84-%EB%82%98%EB%88%84%EB%8A%94-%EA%B2%BD%EC%9A%B0%EC%9D%98-%EC%88%98

 

구슬을 나누는 경우의 수→순수(?) 조합 계산★★

다른 사람의 풀이 class Solution { public long solution(int balls, int share) { share = Math.min(balls - share, share); if (share == 0) return 1; long result = solution(balls - 1, share - 1); result *= balls; result /= share; return result; } } ▶

copro505.tistory.com

 

 

 

 

다른 사람의 정석 풀이

cnt = 0
def DFS(idx, numbers, target, value):
    global cnt
    N = len(numbers)
    if(idx== N and target == value):
        cnt += 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 cnt
    DFS(0,numbers,target,0)
    return cnt

 

cnt를 global로 설정하면, 굳이 cnt를 매개변수로 하여 끌고 다닐 필요가 없다.  

저작자표시 비영리 변경금지 (새창열림)

'프로그래머스(파이썬) > LV.2(파이썬)' 카테고리의 다른 글

귤 고르기→ Counter() 함수, most_common()  (0) 2023.01.02
k진수에서 소수 개수 구하기→ 10진수를 n진법, 소수 판별★,filter()함수★  (0) 2023.01.02
전화번호 목록 →기준값 갱신+startswith()+숫자문자열 정렬★★  (0) 2022.12.29
뉴스 클러스터링→isalpha(), str1[i:i+2], set(), count()★★  (0) 2022.12.28
프린터 → 응급실(큐)+리스트 컴프리핸션 + enumerate()+ any()★★  (0) 2022.12.28
    '프로그래머스(파이썬)/LV.2(파이썬)' 카테고리의 다른 글
    • 귤 고르기→ Counter() 함수, most_common()
    • k진수에서 소수 개수 구하기→ 10진수를 n진법, 소수 판별★,filter()함수★
    • 전화번호 목록 →기준값 갱신+startswith()+숫자문자열 정렬★★
    • 뉴스 클러스터링→isalpha(), str1[i:i+2], set(), count()★★
    @@#@@
    @@#@@
    자바, 스프링, 알고리즘, 깃허브, 파이썬

    티스토리툴바