๐Ÿง‘๐Ÿป‍๐Ÿ’ป Coding Test/โŒจ๏ธ Programmers

[ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ] ํƒ€๊ฒŸ ๋„˜๋ฒ„

EarthSea 2024. 4. 24. 11:25

 

๐Ÿ„ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฌธ์ œ ๋งํฌ

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

โœ๐Ÿป ๋ฌธ์ œ ํ’€์ด Github ๋งํฌ

 

-Swift-CodingTest/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/2/43165.โ€…ํƒ€๊ฒŸโ€…๋„˜๋ฒ„ at main · BaeJihae/-Swift-CodingTest

Swift๋กœ ํ‘ผ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ๋ฌธ์ œ๋“ค์„ ์ •๋ฆฌํ•˜๊ณ  ๊ณต๋ถ€ํ•˜๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค. Contribute to BaeJihae/-Swift-CodingTest development by creating an account on GitHub.

github.com

 

 

 

๋ฌธ์ œ ์„ค๋ช…

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 ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

 

 

์ œํ•œ์‚ฌํ•ญ

  • ์ฃผ์–ด์ง€๋Š” ์ˆซ์ž์˜ ๊ฐœ์ˆ˜๋Š” 2๊ฐœ ์ด์ƒ 20๊ฐœ ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • ๊ฐ ์ˆซ์ž๋Š” 1 ์ด์ƒ 50 ์ดํ•˜์ธ ์ž์—ฐ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • ํƒ€๊ฒŸ ๋„˜๋ฒ„๋Š” 1 ์ด์ƒ 1000 ์ดํ•˜์ธ ์ž์—ฐ์ˆ˜์ž…๋‹ˆ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ

numbers target return
[1, 1, 1, 1, 1] 3 5
[4, 1, 2, 1] 4 2

 

 

 

๋ฌธ์ œ ํ’€์ด

๋‚˜์˜ ํ’€์ด

import Foundation

func solution(_ numbers:[Int], _ target:Int) -> Int {
    
    var answer = 0
    func dfs(now: Int, i: Int){
        if i == numbers.count && now == target {
            answer += 1
        }
            if numbers.count > i {
                dfs(now: now-numbers[i], i: i+1)
                dfs(now: now+numbers[i], i: i+1)
            }
    }
    dfs(now: 0, i: 0)
    return answer
}

 

๋ฐ”๋กœ ์ด์ „์— ํ”ผ๋กœ๋„๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ DFS์˜ ํ’€์ด ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•˜์˜€๊ณ , ์•„์นจ์— ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ํ•œ๋ฒˆ ํ’€์–ด๋ณด์•„์„œ ์ด๋ฒˆ ๋ฌธ์ œ๋Š” ๋ณต์Šตํ•˜๋Š” ๋“ฏ ํ•˜์˜€๋‹ค.

๋”ฑ ๋ณด์ž๋งˆ์ž ์žฌ๊ท€ํ•จ์ˆ˜ DFS๋กœ ํ‘ธ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๊นจ๋‹ฌ์•˜๊ณ , ํ”ผ๋กœ๋„์™€ ์กฐ๊ธˆ๋งŒ ๋ฐ”๊พผ ์ƒํƒœ์—์„œ ํ’€์—ˆ๋‹ค!

ํ•œ๋ฒˆ๋งŒ์— ํ’€๋ฆฌ๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์•„์ฃผ ์พŒ๊ฐ์ด.. ํฌ..

 

 

๋‹ค๋ฅธ ์‚ฌ๋žŒ ํ’€์ด

import Foundation

func searchTarget(number: [Int], depth: Int, target: Int, value: Int, answer: inout Int) {

    // MARK: - ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ˆซ์ž๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด numbers, ํƒ€๊ฒŸ ๋„˜๋ฒ„ target์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ ์ˆซ์ž๋ฅผ ์ ์ ˆํžˆ ๋”ํ•˜๊ณ  ๋นผ์„œ ํƒ€๊ฒŸ ๋„˜๋ฒ„๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.
    if depth >= number.count {
        if target == value { answer = answer + 1 }
        return
    }

    // MARK: - ์ด ์ˆ˜๋ฅผ ์ ์ ˆํžˆ ๋”ํ•˜๊ฑฐ๋‚˜ ๋นผ์„œ ํƒ€๊ฒŸ ๋„˜๋ฒ„๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 
    searchTarget(number: number, depth: depth + 1, target: target, value: value + number[depth], answer: &answer)
    searchTarget(number: number, depth: depth + 1, target: target, value: value - number[depth], answer: &answer)
}

func solution(_ numbers:[Int], _ target:Int) -> Int {

    var answer = 0
    searchTarget(number: numbers, depth: 0, target: target, value: 0, answer: &answer)

    return answer
}

dfs ํ•จ์ˆ˜๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์„œ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— depth์™€ value ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ถ”๊ฐ€ํ•ด์•ผ๋ ๊ฒŒ ๋งŽ์•„์ง„ ๋“ฏ ํ•˜๋‹ค!

๋‚˜๋„ dfs ํ•จ์ˆ˜๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“œ๋Š” ์—ฐ์Šต์„ ํ•ด๋ด์•ผ๊ฒ ๋‹ค.

๊ทธ๋ฆฌ๊ณ  answer์€ ๊ฐ’ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ answer ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” return ํ˜•ํƒœ๊ฐ€ ์•„๋‹Œ inout ํ‚ค์›Œ๋“œ๋ฅผ ์จ์„œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

์˜ค๋Š˜๋„ ๋˜ ํ•˜๋‚˜ ๋ฐฐ์šด๋‹ค.

 

 

import Foundation

func caculation(numbers: [Int], target: Int, index: Int, sum: Int) -> Int {
    if index == numbers.count {
        return sum == target ? 1 : 0
    }

    return caculation(numbers: numbers, target: target, index: index + 1, sum: sum + numbers[index]) + caculation(numbers: numbers, target: target, index: index + 1, sum: sum - numbers[index])

}

func solution(_ numbers: [Int], _ target: Int) -> Int {
    return caculation(numbers: numbers, target: target, index: 0, sum: 0)
}

์ด ๋ถ„์€ ๋‹ต์„ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋„์ถœํ•˜์˜€๋‹ค.

ํ•จ์ˆ˜ ์ž์ฒด์˜ return ๊ฐ’์„ ์ฃผ์–ด์„œ ๋ฐ˜๋ณต๋ฌธ์ด ๋๋‚œ ํ•ฉ์ด target๊ณผ ๊ฐ™๋‹ค๋ฉด 1๋ฅผ ์ถœ๋ ฅํ•˜๋Š”๋ฐ, ํ•ด๋‹น 1์„ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ๋”ํ•˜์ง€ ์•Š๊ณ ,

์žฌ๊ท€ํ•จ์ˆ˜๋ผ๋ฆฌ ๋”ํ•˜์—ฌ ๋‹ต์„ ๋„์ถœํ•˜์˜€๋‹ค.