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를 아무때나 쓰는게 아니라는 점과, 언제 쓰는지 다시 한 번 체감했다
func addOne(_ value: inout Int) {
value += 1
}
var number = 10
addOne(&number)
print(number) // 11
var count = 0
func increment() {
count += 1 // 외부 변수 count 직접 수정
}
increment()
print(count) // 1