๐ฌ ์ก๋ด
์,, ์ด์ SKํ๋๋ ์ฝํ ๋ฅผ ๋ดค๋๋ฐ ๋ฌธ์ ๋ ๋ถ๋ช ์ฌ์๋ค. ๊ทธ๋ ์ฌ์ ์ด. ๊ทผ๋ฐ ๋ํํ ์ฌ์ ๋ค๊ณ ๋ ์ํ๋ค ใ ใ ใ ใ ใ ์ฝํ ๊ณต๋ถ๊ฐ ์๋ฌด๋๋ ์กฐ๊ธ ๋ถ์กฑํ ์ง๊ธ ์์ฃผ์์๋,,,, ์ด๋ป๊ฒ ํ์ง ๊ฐ์ด ์กํ๋ฏ ๋ง๋ฏ ํ๋ฉด์ ํจ์จ์ฑ์ด ์์ฒญ ๋จ์ด์ง๋ ์ฝ๋๋ฅผ ๊ตฌํํ๊ณ ๋ง์๋ค.
์ด์จ๋ ,, 4๋ฌธ์ ์ค์ 3์์ ํ๊ธด ํ๋ค๋ง,,,, ๋๊ฐ์ ๋๋ ์๊ฐ์ด๊ณผ๋ก ํธ๋ฆด๊ฒ ๊ฐ๋ค ํคํค
๊ทธ๋ฌ๋ ์์ค, ์ค๋ ํ๋ ๋ฌธ์ ์์ ๋ฐ์ํ ์๊ฐ์ด๊ณผ!
์ฝํ
๋ฅผ ์ค๋นํ๋ฉด ํ ์๋ก ์๊ฐ๋ณต์ก๋์ ๋ํ ์๊ฐ์ด ๊น์ด์ง๋ค. ์ด ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ๋น ๋ฅด๊ฒ ์บ์นํด๋ผ ์ ์์๊น? ์๊ณ ๋ฆฌ์ฆ์ ํญ์ ๊ตฌํํ๋ฉด์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ณ์ฐํ๋ ๋ฒ๋ฆ์ ๋ค์ฌ์ผํ ๊ฒ ๊ฐ๋ค.
์ง๊ธ ๊ฒฝ์ฐ๋, ํ๋ ์ผ์ด์ค์์ ๋๊ฐ ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๋๋ฐ,,,, SKP ์ฒ๋ผ ํ๋ ์ผ์ด์ค๊ฐ ์ฃผ์ด์ง์ง ์๋ ์ํ์์๋ ์ด๋ฐ๊ฒ์ ๋ชจ๋ฅธ์ฑ ์ ์ถํ๊ฒ ์ง..? ๊ทธ๋ผ ๋ ํ๋ฝ์ด๊ฒ์ง? ํํํํํํํ ์ด๋ ต๋ค ์ด๋ ค์
โซ๏ธ ๋ฌธ์
https://school.programmers.co.kr/learn/courses/30/lessons/43165?language=swift
โซ๏ธ ๋์ ํ์ด
๋ญ๊ฐ,, ์ฌ๊ท๋ก ํ๋ฆด ๋ฏํ ๋๋์ ์๋๋ผ์ BFS์ ๋ํ ๊ธฐ์ด ๊ฐ๋ ์ ๋ค์ ํ๊ณ ์ง๋์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ ๋ฌธ์ ๋ฅผ ์ฝ์ด๋ณด๋ ์๊ฐ, ์ ์ด๊ฑด BFS๊ตฌ๋๋ฅผ ๊นจ๋ฌ์๋ค. (์ฌ์ค,, ์ด์ ์ ์ด ๋ฌธ์ ๋ ํ์ด์ฌ์ผ๋ก ํ์ด๋ณธ ๊ฒฝํ์ด ์๋ค. ์์ฃผ ์ฌ๋! ๊ธฐ์ต์ด ๋๋ค.)
https://github.com/HotCodeBreakers/CodingTest/discussions/25
๋ด๊ฐ ์ ๋ฆฌํด๋ ์ด ๊ธ์ ๋ณด๋ฉด, BFS๋ ๋ชจ๋ ๋ ธ๋๋ฅผ ์ง๋์น๋ฉด์ ๋ชจ๋ ๊ฒฝ์ฐ์์๋ฅผ ์ดํด๋ณธ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์, ํ ๊ฐ์ง ๋ฐฉํฅ๋ง์ผ๋ก ๊ฐ์ ํด๋ฅผ ๊ฐ์ ธ์ค๋ DFS๊ฐ ์๋๋ผ, ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ดํด๋ณด๋ BFS ์๊ณ ๋ฆฌ์ฆ์ด ์ด ๋ฌธ์ ์๋ ๋ ์ ํฉํ๋ค.
์ด๋ป๊ฒ ํ์ง ๊ณ ๋ฏผ์ ํ๋ ์์ค, ์๋์ ๊ฐ์ด ๊ท์น์ ์ฐพ์๋๋ค.
๋นจ๊ฐ์์ผ๋ก ์ฐ์ฌ์ง ์ซ์๋ ์ธ๋ฑ์ค ๋ฒํธ์ด๋ค. ์ฐ๋์ ํ๊ดํฌ์ผ๋ก ์ฃผ์ด์ง ๋ถ๋ถ์ด numbers๋ก ๋ค์ด์๋ค๋ฉด, ์๋ ์์๋๋ก ๊ณ์ฐ์ ๊ฑฐ์น๋ค. ์ด๋ฐ์ 4ํน์ -4๊ฐ ๋ํด์ง๊ฑฐ๊ณ , ๊ทธ ์ดํ์ ์ธ๋ฑ์ค๋ฅผ ํ๋์ฉ ๊ฑฐ๋ญํ๋ฉฐ -์ +๋ฅผ ๋ถ์ธ ๊ฒ๋ค์ด ๋ํด์ง ๊ฒ์ด๋ค. ์ด๊ฒ์ ๋๋ while๋ฌธ์ผ๋ก ๊ตฌํํ๊ณ , while๋ฌธ์์ ํ์ถํ๋ ์กฐ๊ฑด์ ๋์ด์ ๊ณ์ฐํ ๊ฒ์ด ๋จ์์์ง ์์ผ๋ฉด ํ์ถํ๋ผ๋ ์กฐ๊ฑด์ ์ฃผ์๋ค.
โ ์ฒซ๋ฒ์งธ ์๋ - ์๊ฐ์ด๊ณผ
import Foundation
func solution(_ numbers:[Int], _ target:Int) -> Int {
var queue = [(Int, Int)]()
queue.append((-numbers[0], 0))
queue.append((numbers[0], 0))
var answer = 0
while !queue.isEmpty {
let q = queue.removeFirst()
let num = q.0
var idx = q.1
idx += 1
if idx < numbers.count {
queue.append((num+numbers[idx], idx))
queue.append((num-numbers[idx], idx))
} else {
if target == num {
answer += 1
}
}
}
return answer
}
์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๋ค. ์ฐ์ , ๋ชจ๋ ๋ ธ๋๋ฅผ ํ์ํด์ฃผ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฑํํ๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด๊ณผ์ ์ ์ํด์ผํจ์ ์๊ณ ์์๋ค. ๊ทธ๋ผ ์ด์ ์์ ํด๋ณผ๊น,,,
์ฐ์ queue์ ๊ธธ์ด๋งํผ (๋ ธ๋์ ๊ฐ์ ์ ์๋งํผ) while๋ฌธ์ด ๋์๊ฐ๊ธฐ ๋๋ฌธ์ ํ์ฌ ์๊ฐ๋ณต์ก๋๋ O(N)์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ด๋ถ์ removeFirst()๋ผ๋ ๋ฉ์๋๊ฐ ์ฌ์ฉ๋๋๋ฐ, ์ด ๋ฉ์๋ ์์ฒด์ ์๊ฐ๋ณต์ก๋๋ O(N)์ด๋ค. ์ด ๋ถ๋ถ์ O(1)๋ก ๋ฐ๊ฟ๋ณด๋๊ฒ ์ด๋จ๊น
โ ๋๋ฒ์งธ ์๋ - ์ ๋ต์ฝ๋
์์์ ์ธ๊ธํ๊ฒ ์ฒ๋ผ, ์ธ๋ฑ์ค์ ์ ๊ทผํ๋ ๋ฐฉ์์ ์๊ฐ๋ณต์ก๋๋ฅผ O(N)์์ O(1)๋ก ์ค์ด๋๊น ๋ฐ๋ก ํต๊ณผ๊ฐ ๋์๋ค. ๊ตณ์ด queue ๋ด๋ถ์ ์ฒซ๋ฒ์งธ๋ถํฐ ์ ๊ทผํด์ผํ๋ ์์ฐจ์ ์ธ ์กฐ๊ฑด์ด ์ฃผ์ด์ง๊ฒ ์๋๊ธฐ ๋๋ฌธ์, queue์ ๋ค์ด์ด์์๋ ์ ๋ค์ค ๋ง์ง๋ง ์ ๋ถํฐ ์ ๊ทผํ๋ค. (์ด๋ฆ์ ํ ์ด์ง๋ง, ํ ๋ณด๋ค๋ ์คํ ์ฑํฅ์ ๊ฐ์ง arr๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๋ณด๋ฉด ๋๋ค.)
swift์์ removeLast()๋ ๋ฐฐ์ด์ ๋ง์ง๋ง ์์์ ์ ๊ทผํ๋ฏ๋ก, ๋ฐฐ์ด์์ ๋ฌด์ธ๊ฐ๋ฅผ ๊บผ๋์๋ ๋ฐฐ์ด์ ์ฌ์ ๋ ฌํด์ค ํ์๊ฐ ์๋ค. ๊ทธ๋์ ์ธ๋ฑ์ค๋ก ์ ๊ทผํ๋ ๊ฒ๊ณผ ๋์ผํ O(1)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค. ๊ทธ๋ ๊ฒ ... ๋ฐ๋ก ํต๊ณผ!!
import Foundation
func solution(_ numbers:[Int], _ target:Int) -> Int {
var queue = [(Int, Int)]()
queue.append((-numbers[0], 0))
queue.append((numbers[0], 0))
var answer = 0
while !queue.isEmpty {
let q = queue.removeLast()
let num = q.0
var idx = q.1
idx += 1
if idx < numbers.count {
queue.append((num+numbers[idx], idx))
queue.append((num-numbers[idx], idx))
} else {
if target == num {
answer += 1
}
}
}
return answer
}
let numbers = [1, 1, 1, 1, 1]
let target = 3
print(solution(numbers, target))
๐ฌ ๋ ์ก๋ด! ์๊ฐ์ด๊ณผ์ ๋ํ ์ก๋ด,,
์๊ณ ๋ฆฌ์ฆ๊ณผ ๊ด๋ จํด์ ์น๊ตฌ์ ๋ํ๋ฅผ ๋๋ด๋ค. '๋นํจ์จ์ ์ธ ์ฝ๋๋ฅผ ๊ฐ์ ํ๋ค'๋ผ๋ ์ด์ผ๊ธฐ๊ฐ ๋์์ '๋นํจ์จ'์ด๋ ๋ญ๊น์ ๋ํด์ ์ ๊น ์ด์ผ๊ธฐ๋ฅผ ๋๋๋ ๊ณผ์ ์์ ์น๊ตฌ๊ฐ ์ ํํ๊ฒ ๋ด ์ฌ๋ก๋ฅผ ์ด์ผ๊ธฐํด์ฃผ์๋ค.
๋ฐ๋ก ๋ด๊ฐ ์ง๊ธ ์ด๊ฒฝ์ฐ๋ค!! ์น๊ตฌ๋ ๋ช๊ฐ๊ฐ ์๊ฐ์ด๊ณผ๊ฐ ๋๋๊ฒฝ์ฐ, ๋ณธ์ธ์ ์๊ณ ๋ฆฌ์ฆ์ ๋นํจ์จ์ ์ธ ์ธก๋ฉด์ ์ฐพ๋ ๊ณผ์ ์ ๊ฑฐ์น๋๋ฐ ๊ทธ ๊ณผ์ ์์ ์ด๋ฐ ์ํฉ๋ ์์ฃผ ๋ฐ์ํ๋ค๊ณ ํ๋ค. ์ง๊ธ ๋ฑ ๋ด๊ฒฝ์ฐ๋ค. ๋๋ queue๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๋๋ฐ ๋ฐฐ์ด์ queue์ฒ๋ผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ (removeFirst) ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ๊ณ , ์ด๋ฅผ ๊ฐ์ ํ๋๊น ๋ฐ๋ก ํต๊ณผ๊ฐ ๋์๋ค.
๋ ์๊ฐ์ด๊ณผ๊ฐ ๋๋ ์ด์ ์ค ํ๋๊ฐ ์ ๋๋ก๋ ์์ธ์ฒ๋ฆฌ๊ฐ ๋์ง ์์์๋ ๋ง์ด ๋ฐ์ํ๋ค๋ฉฐ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ถ๋ถ ๋จผ์ ๊ฒํ ํ๋ฉด์ ๋ฌธ์ ๋ฅผ ํ์ผ๋ผ๊ณ ์กฐ์ธํด์ฃผ์๋ค. ์๋ฅผ๋ค์ด, 0์ด๋ฉด ํ์ถํด์ผํ๋ค๊ฑฐ๋, 10000๋ฒ ์ด์ ๋ฐ๋ณต๋๋ฉด ๋์ด์ ์๋ฏธ๊ฐ์๋๋ฐ ๋ด ์๊ณ ๋ฆฌ์ฆ์์ 10000๋ฒ ์ด์ ๋์๊ฐ๊ณ ์๋ค๊ฑฐ๋ ๋ฑ๋ฑ!
๊ทธ๋ฆฌ๊ณ ์ฌ์ง์ด๋ input์ ๋ฒ์๋ฅผ ์ ํํด์ฃผ๋ฉด์ ์๊ฐ์ด๊ณผ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ ๊ฒฝ์ฐ๋ ์๋ค๊ณ ํ๋ค. while๋ฌธ ๋ด๋ถ์์ ๋ฐ๋ณตํ์๋ฅผ ์ ํํ๋ค๊ฑฐ๋ ์ด๋ฐ์์ผ๋ก! ์ฐธ.. ๋ค์ํ๊ฒ ํ๋ฆฐ๋ค. ์ด๋ฐ ์ด์ผ๊ธฐ๋ฅผ ํด์ฃผ๋ ์น๊ตฌ๋ฅผ ๋ณด๋ฉด์ ์ผ๋ง๋ ๋ง์ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ํ๋ฉด์ ๊ณ ๋ฏผํด๋ดค๋์ง ์ ์ ์์๋ค.... ๋ฉ์ง๋ค! ์ฐ์ง์
๋ ์น๊ตฌ๊ฐ ๋ง์ ์กฐ์ธ์ ํด์ฃผ์๋๋ฐ ๋ค ๋์ ๊ฒฝ์ฐ, ๋ด๊ฐ ํํํ๋ ์ค์๋ค์ด๋ผ ๋๋ฌด ๋๋๋ค. ์๋ฅผ๋ค์ด ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๋ฌป๋ ๋ฌธ์ ๋ฉด, ๋๋ BFS๋จผ์ ๋ ์ฌ๋ฆฌ๋๋ฐ ์ฌ์ค ๋ค์ต์คํธ๋ผ, ํ๋ฃจ์ด๋์์ ์๊ณ ๋ฆฌ์ฆ์ ๋ ์ฌ๋ ค์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค๊ณ ํ๋๋ฐ,,, ๋๋ ๊ทธ๋ฅ ๋ฌดํฑ๋๊ณ BFS๋ ๋ฐ๋ณต๋ฌธ์ ๋ ์ฌ๋ฆฌ๊ณค ํ๋ค ใ ใ ๋ค ๊ฒช๋ ๊ณผ์ ์ด๊ตฌ๋... ์์ง ๋ฐฐ์ธ๊ฒ ๋๋ฌด ๋ง๊ณ ๊ฐ๊ธธ์ด ๋ฉ๋ค.