2020년/코테

[코테 연습] 타겟 넘버 Python

위지원 2020. 6. 9. 12:15

일주일동안 뭐하고 산거냐 위지원!!!!!!!!! 정신안차려!!!

 

문제 설명

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

-1+1+1+1+1 = 3 +1-1+1+1+1 = 3 +1+1-1+1+1 = 3 +1+1+1-1+1 = 3 +1+1+1+1-1 = 3

사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 return 하도록 solution 함수를 작성해주세요.


cnt = 0
def solution(numbers, target):
    n = len(numbers)
    calRes = [1 for _ in range(n)]

    def cal(resArr, idx):
        if idx < len(resArr):
            resArr[idx] *= 1
            cal(resArr, idx + 1) #계속 탐색하게 하고,,
            
            resArr[idx] *= -1
            cal(resArr, idx + 1)
            
        else: #하나의 탐색이 끝났을 땐 count를 올려주고,,
            if sum(resArr) == target:
                global cnt #cnt를 solution 함수 안에서 선언 했으면 nonlocal로 ㄱㄱ
                cnt += 1

    cal(calRes, 0)
    return cnt

 

예제에서 주어진 케이스는 통과했다.. 헌데

 

 

????????????????

 

n개의 음이 아닌 정수가 있습니다.

 

또 문제 제대로 안읽었다.. 하 그냥 뛰어내려야지

 

calRes = [i for i in numbers]

 

이 부분만 변경했다. 통과 ,, 

 

고득점의 비결은,, 문제를 꼼꼼히 읽는데서 시작한Da,..

 


근데 +1과 -1을 바꾸어주는 곳의 위치가 변경되면 결과가 다르게 나온다

 - +1을 먼저 위치하고 recursive를 한 경우 => 5

-  -1을 먼저 위치하고 recursive를 한 경우 => 2

            resArr[idx] *= - 1
            cal(resArr, idx + 1)
            resArr[idx] *=  1
            cal(resArr, idx + 1)
            
            ==> 2
            
            resArr[idx] *=  1
            cal(resArr, idx + 1)
            resArr[idx] *= - 1
            cal(resArr, idx + 1)
            
            ==> 5
입력값 [1, 1, 1, 1, 1], 3
기댓값 5
실행 결과 실행한 결괏값 2이(가) 기댓값 5와(과) 다릅니다.

왜지?

 

아,, -1을 처음에 곱해버리믄 맨 앞 정수가 -가 되는데 그러면 +1을 아무리 곱해도 계속 -정수로 남아있어서 그런건가..! 결과를 출력했을 때 보면 그렇다 앞에가 처음에 -1로 시작하니까 끝날때까지 -1이다.  이해력 딸리는 위지원이 또 ,,