[Swift] [9일차] 타겟넘버

·2024년 12월 16일
0

SwiftAlgorithm

목록 보기
12/105
post-thumbnail

Programmers-타겟넘버

import Foundation

func solution(_ numbers: [Int], _ target: Int) -> Int {
    var answer = 0
    func targetFind(_ idx: Int, _ total: Int) {
        if idx == numbers.count - 1 {
            print("MATCH")
            if total == target {
                answer += 1
            }
            return
        }
        else {
            targetFind(idx + 1, total + numbers[idx])
            targetFind(idx + 1, total - numbers[idx])
        }
    }
    targetFind(0, 0)
    return answer
}

출력값

1


왜 1 이 나오지 ?

이거 때문에 좀 오래 고민을 했던 것 같다. 일반적으로 잘 돌아갔으면 1은 절대 안나오는 값이라고 생각했기 때문!
혹시 answer값을 참조를 못해오나?해서 inout으로 파라미터를 만들어줘서 하기도 했는데, 내부함수에서는 inout없이도 잘 참조해올 수 있기때문에 차이는없었다.

해결

결국 - 해주는 로직을 주석처리해보고 +만했는데도 [1,1,1,1,1]이 주어졌을때 5가아니라 4까지만 나오는 것을 보고 이게 마지막 원소를 계산해주지 않고 있구나를 알았다.
처음 `targetFind()를 +와 -로 두 번 호출하는게 코드가 일관성있게 보이지 않아서, 처음 인자를 0,0 담고 한번만 호출해서 사용했기 때문에,

 else {
            targetFind(idx + 1, total + numbers[idx])
            targetFind(idx + 1, total - numbers[idx])
        }

이런식으로 +1 해주면서 현재 배열값을 더하는 로직으로 짜줬다. 다음 원소를 넣는다는 것을 상정해두고 짰기 때문에 idx는 사실 count랑 동일할 때 이제 target과 비교를 해줘야했다.

idx == numbers.count-1 이 아니라 idx == numbers.count 비교가 필요하다


완성코드

import Foundation

func solution(_ numbers: [Int], _ target: Int) -> Int {
    var answer = 0
    func targetFind(_ idx: Int, _ total: Int) {
        if idx == numbers.count {
            if total == target {
                answer += 1
            }
            else {
                return
            }
        }
        else {
            targetFind(idx + 1, total + numbers[idx])
            targetFind(idx + 1, total - numbers[idx])
        }
    }
    targetFind(0, 0)
    return answer
}

느낀점

inout를 아무때나 쓰는게 아니라는 점과, 언제 쓰는지 다시 한 번 체감했다

inout 사용

  • 함수 내부에서 값을 수정하여 반드시 외부 변수에 반영해야 하는 경우
func addOne(_ value: inout Int) {
    value += 1
}

var number = 10
addOne(&number)  
print(number)    // 11

inout 없이 외부 변수 수정

  • 외부 변수가 함수의 범위 안에서 직접 참조 가능한 경우
var count = 0

func increment() {
    count += 1 // 외부 변수 count 직접 수정
}
increment()
print(count)    // 1
profile
기억보단 기록을

0개의 댓글