๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“– Problem Solution/Programmers

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

by Fomagran ๐Ÿ’ป 2020. 8. 31.
728x90
๋ฐ˜์‘ํ˜•

ํ’€์ด

numbers์˜ ๊ฐ’์„ ์ €์žฅํ•  ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค. -> var numbersCopy = [Int]()

target ๊ฐ’์„ ์ €์žฅํ•  ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค. -> var targetCopy = 0

๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค. -> var count = 0

 

numbers์˜ ์ˆซ์ž๋“ค์„ ์ฐจ๋ก€๋กœ ๋”ํ•˜๊ฑฐ๋‚˜ ๋บ์„ ๋•Œ ๋‘๊ฐ€์ง€ ๋ชจ๋‘๋ฅผ ์‹คํ–‰์‹œํ‚ค๋„๋ก ํ•˜์—ฌ ๊นŠ์ด๊ฐ€(depth) numbers์˜ ๊ฐฏ์ˆ˜์— ๋„๋‹ฌํ•˜๋ฉด ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜๋Š” ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.(dfs)  func dfs(_ depth: Int, _ sum: Int) { if depth == numbersCopy.count { ... }  return }

numbers์˜ ๊ฐฏ์ˆ˜์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ํ•ฉ์ด target์˜ ๊ฐ’๊ณผ ๊ฐ™๋‹ค๋ฉด ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ์ฃผ๋„๋กํ•ด์ค๋‹ˆ๋‹ค. =>  if sum == targetCopy {  count += 1

ํ•ฉ์— ๋‹ค์Œ ์ˆซ์ž๋ฅผ ๋”ํ•ด์ค„ dfs์™€ ํ•ฉ์— ๋‹ค์Œ ์ˆซ์ž๋ฅผ ๋บ„ dfs๋ฅผ ๊ฐ๊ฐ ์žฌ๊ท€ํ•˜๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.

=>   dfs(depth + 1, sum + numbersCopy[depth])

       dfs(depth + 1, sum - numbersCopy[depth])

์ดˆ๊ธฐ๊ฐ’์œผ๋กœ dfs์— (0,0)์„ ๋„ฃ์–ด์ฃผ๊ณ  numbers๊ฐ€ [1,1,1,1,1]์ด๊ณ  taget์ด 3์ธ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด

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

    

    numbersCopy = numbers

    targetCopy = target

    dfs(00)

 

    return count

}

 

depth = 1

1

-1

depth = 2

2 0 

0 -2

depth = 3

3 1  1 -1

1 -1 -1 -3

depth = 4

4 2 2 0 2 0 0 -2

2 0 0 -2 0 -2  -2 -4

depth = 5

5 331 -1 3 1  1 -1  1 -1  -1 -3 

3 1  1 -1  1 -1  -1 -3  1 -1 -1 -3  -1 -3 -3 -5

3์ธ ์ˆซ์ž๊ฐ€ ์ด 5๊ฐœ ์ด๋ฏ€๋กœ ์ •๋‹ต์€ 5๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

 

์ด๋ฒˆ ๋ฌธ์ œ๋Š” ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋Š” DFS(Depth - First - Search) ๊นŠ์ด์šฐ์„ ํƒ์ƒ‰์œผ๋กœ ํ’€์—ˆ์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์˜€๋Š”๋ฐ

DFS๋ฅผ ๋ชจ๋ฅด๊ณ  ์žˆ์–ด์„œ ์ •๋ง ๋ณต์žกํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋‹ค๊ฐ€ ๊ฒฐ๊ตญ ๊ตฌ๊ธ€๋งํ•ด์„œ DFS๋ฌธ์ œ์ธ๊ฒƒ์„ ์•Œ๊ณ  ํ’€๊ฒŒ ๋˜์—ˆ๋‹ค.

 

์ „์ฒด ์ฝ”๋“œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var numbersCopy = [Int]()
var targetCopy = 0
var count = 0
 
func dfs(_ depth: Int, _ sum: Int) {
 
    if depth == numbersCopy.count {
        if sum == targetCopy {
            count += 1
        }
        return
    }
    
    dfs(depth + 1, sum + numbersCopy[depth])
    dfs(depth + 1, sum - numbersCopy[depth])
    
}
 
func solution(_ numbers:[Int], _ target:Int-> Int {
    
    numbersCopy = numbers
    targetCopy = target
    dfs(00)
    
    return count
}

 

 

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€