[프로그래머스] Lv2. 타겟 넘버(Python)

zzzzsb·2024년 10월 9일
0

프로그래머스

목록 보기
31/33

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/43165

풀이 시간

약 10분


접근 방식

dfs 함수를 만들어서 재귀호출 방식으로 풀이했다.

현재까지의 합에 더하는경우, 빼는 경우 두가지를 재귀호출한다.

numbers를 모두 순회했다면 현재까지의 합이 target과 같은지 비교하고, 같다면 answer에 1을 더해줬다.


정답 코드

def solution(numbers, target):
    answer = 0
    
    def dfs(idx, sum):
        nonlocal answer
        if idx == len(numbers):
            if sum == target:
                answer += 1
            return
        dfs(idx+1, sum+numbers[idx])
        dfs(idx+1, sum-numbers[idx])
        
    dfs(0,0)
    return answer

Thinking 👀

dfs 함수 내부에서 상위 solution 함수에 선언된 answer 변수를 사용하려고 하니 오류가 났다.
그래서 dfs 함수에서 answer 변수는 local이 아니다, 라고 nonlocal 로 선언해주니 오류가 사라졌다.

nonlocal

  • 해당 변수가 local이 아니다, 라고 선언해주는 키워드
  • 상위 함수에 있는 변수를 참조한다고 미리 선언해두는 것
def test():
   a = 3

   def sum():
       nonlocal a
       a = 7
       return True

   sum()
   return a

result = test()
print(result)
  • 위와 같이 실행하면 sum() 함수에서 상위 test() 함수에 있는 a 변수값을 사용할 수 있게 된다.

global

  • 일반 함수 내에서 전역 변수를 사용하고 싶을때 사용하는 키워드

nonlocal vs global

c = 11
def test():
   a = 3
   b = 9

   def sum():
       nonlocal a
       global b
       a = 7        # nonlocal 변수는 상위 변수의 접근 O
       b = 11       # global 변수는 중첩함수내에서 상위 함수의 변수는 접근 X

       global c
       c = 13       # global 변수는 함수 외부의 변수는 접근 가능
       return True

   sum()
   return a, b, c

result = test()
print(result)     # (7, 9, 13) 출력
  • nonlocal 변수는 중첩 함수 내에서 상위함수 변수를 사용할때 사용한다.
  • global 변수는 중첩함수 내에서 상위함수 변수에 접근할수 없다. 하지만 전역변수 이기 때문에 함수 외부에 선언되어 있는 변수에는 접근 가능하다.

참고 링크

profile
성장하는 developer

0개의 댓글