본문 바로가기
프로그래머스/Python

[프로그래머스] 타겟 넘버 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2023. 7. 31.
728x90
반응형

 

 

프로그래머스

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

programmers.co.kr

 

1. 문제 설명

2. 풀이과정

각 수마다 -, + 두 가지 경우의 수가 존재한다. 따라서 총 (2 ** 숫자의 개수) 가지의 경우의 수가 나온다.

하여 모든 경우의 수를 구하고 이를 하나씩 확인하여 각 수의 합을 구한 뒤, 해당 합이 타겟 넘버와 같은지 비교하는 방식으로 문제를 해결하였다.

 

  1. 각 경우의 수를 구할 때 appendleft() 함수를 사용하기 위해 deque 모듈을 불러온다. from collections import deque
  2. 모든 경우를 저장할 리스트를 생성한다. graph = list()
  3. 모든 경우를 구할 때는 각 수를 2진수로 변환한 값을 저장하는 방식으로 구하였다. 하여 0부터 수를 하나씩 추출하여 for i in range(2 ** len(numbers))
  4. 해당 수의 2진수 변환 결과를 저장할 deque을 생성하고 d = deque()
  5. 해당 수가 0이 될 때까지 반복하며 while (i > 0)
  6. 해당 수를 2로 나눈 나머지를 추가하고 d.append(i % 2)
  7. 해당 수를 2로 나눈 몫을 새로 저장한다. i //= 2
  8. 2진수로 변환한 결과는 거꾸로 저장되기 때문에 순서를 뒤바꿔주고 d.reverse()
  9. 숫자의 개수만큼 자리를 채우기 위해 앞에 0을 채운다. while (len(d) < len(numbers)): d.appendleft(0)
  10. 2진수 변환 결과를 리스트에 추가한다. graph.append(d)
  11. 모든 경우의 수를 구했으면 각 경우를 하나씩 추출하여 각 경우를 확인한다. for i in graph
  12. 각 경우마다 합을 저장할 변수를 생성하고 초기화한다. num = 0
  13. 각 경우의 결과를 하나씩 추출하여 for j in range(len(i))
  14. 만약 결과가 0이면 뺄셈을 계산하고 if (i[j] == 0): num -= numbers[j]
  15. 결과가 1이면 덧셈을 계산한다. else: num += numbers[j]
  16. 해당 경우의 모든 결과를 확인한 뒤, 만약 계산 결과가 타겟 넘버랑 일치하면 if (num == target)
  17. 방법의 수를 1 증가시킨다. answer += 1
반응형

3. 소스코드

from collections import deque

def solution(numbers, target):
    answer = 0
    
    graph = list()
    for i in range(2 ** len(numbers)):
        d = deque()
        while (i > 0):
            d.append(i % 2)
            i //= 2

        d.reverse()
        while (len(d) < len(numbers)):
            d.appendleft(0)

        graph.append(d) 

    for i in graph:
        num = 0
        for j in range(len(i)):
            if (i[j] == 0):
                num -= numbers[j]
            else:
                num += numbers[j]

        if (num == target):
            answer += 1

    return answer
728x90
반응형