โซ๏ธ ๋ฌธ์
https://school.programmers.co.kr/learn/courses/30/lessons/43236?language=swift
โซ๏ธ ๋์ ํ์ด
์ด ๋ฌธ์ ๋ํ ์ด๋ถํ์์ผ๋ก ๋ถ๋ฅ๊ฐ ๋์ด์์๊ธฐ ๋๋ฌธ์ ํ๋ผ๋ฉํธ๋ฆญ ์์น๋ก ํ์ด์ผ๊ฒ ๋ค, ์ถ์ ๊ฐ์ด ์๋ ๊ฑฐ์ง ๊ทธ๊ฒ ์๋๋ผ๋ฉด ์๊ธฐ ์ฝ์ง ์์ ๊ฒ ๊ฐ๋ค. ํ์ง๋ง ๊ฐ์ฅ ๋จผ์ ๋์ ๋ณด์ด๋๊ฑด 10์ต์ด๋ผ๋ ์ด๋ง์ด๋งํ ๋ฒ์. ์ด๊ฒ๋ง์ด ์ด๋ถํ์์ผ ๊ฒ์ด๋ค ~ ํ๋ ๊ฐ?์ ์ค ๋ฟ์ด๋ค.
์ฒ์์๋ ์ญ์๋, ๋ฌธ์ ๋ฅผ ๋ณด์๋ง์ ์ด๋ค ๊ฒ์ ์ด๋ถํ์์ ๋์์ผ๋ก ์ฃผ์ด์ผํ ์ง ๋๋ฌด ๊ณ ๋ฏผ์ด์๋ค. ์ฒ์์ ์๊ฐํ๊ฑด, ๋์ ๊ฐ๊ฒฉ์ ์ต์๋ฅผ ์ฐพ๋ ๊ณผ์ ์ด๊ธฐ ๋๋ฌธ์ ๋์ ๊ฐ๊ฒฉ์ ๋ฌด์กฐ๊ฑด์ ์ผ๋ก left ์ right๋ก ๋๊ณ ํ์์ ์งํํด์ผํ๋ค๊ณ ์๊ฐํ๋ค. ๊ทธ๋ผ.. ๋์ ๋ญ ์ด์ผ ์ญ์ ํจ? ์ญ์ ํ ๋์ ๊ธฐ์ค์ผ๋ก ๊ฐ๊ฒฉ์ ์๊ฐํด์ผํ๋๋ฐ ๊ทธ๊ฑฐ ์ด๋ป๊ฒ ์ ์ฉ์ํฌ๊ฑด๋ฐ1?!!?
์ฐ๋ฆฌ๊ฐ ๋์ ๊ฐ๊ฒฉ์ ๊ณ ๋ คํด์ ์ต์๊ฐ์ ์ฐพ์ ๋ ๋ํ๋์ ์กฐ๊ฑด์ ๊ณ ๋ คํด์ผํ๋ค. '๋์ด ์ญ์ ๋๋ ๊ฐ์!'์ด๋ค. ์ฃผ์ด์ง n๊ฐ๋งํผ๋ง ์ญ์ ๋์ด์ผํ๋๋ฐ, ์ด๊ฒ์ ํ๋ผ๋ฉํธ๋ฆญ ์์น๋ก ํ์ฉํ ์ ์์ง ์์๊น?
์๋ฅผ๋ค์ด, ๋์ด ์ญ์ ๋ ๊ฐ์๊ฐ n๊ฐ ์ด์์ด๋ฉด?? → ๋๋ฌด ๋ง์ด ์ญ์ ๋๊ฑฐ์ผ! → ์ญ์ ๋๋ ๋์ ๊ฐ์๋ฅผ ์ค์ด๋ ค๋ฉด ์ด๋ป๊ฒ ์ ๊ทผํด์ผํ์ง?
์ด๋ ๊ฒ ์๊ฐํ ์ ์๊ฒ ๋ค... ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ์๊ฐ์ด ๋งํ๋ค. ์ด๋ค ์กฐ๊ฑด์ ์ฃผ์๊ธธ๋ ๋์ด ๋ง์ด ์ญ์ ๋๋๊ฑฐ์ง ? ใ ใ ใ ใ ใ ๊ทธ๋๊น ๋์ ์ ๋ฌด์จ์กฐ๊ฑด๋๋ฌธ์ ์ญ์ ์ฌ๋ถ๊ฐ ๊ฒฐ์ ๋๋๊ฑด๋ฐ!! ๊ผฌ๋ฆฌ์ ๊ผฌ๋ฆฌ๋ฅผ ๋ฌผ๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ํด๊ฒฐ์ฑ ์ ๋ณด์ด์ง ์์๋ค. ใ ใ ใ ใ ... ํ ์ฌ๋ ต๊ณ ๋ง
์ธํฐ๋ท์ ์ด์ง ์ฐธ๊ณ ํ๋ค. ์ฐธ๊ณ ํ๋ฉด์ ์๋ ๋ธ๋ก๊ทธ์ ์๊ฐ์ ๊ฐ๋ฐฉ์์ด ๋ด ์๊ฐ๊ณผ ์กฐ๊ธ? ๋น์ทํ๊ณ ์์ธํ ์จ์ฃผ์ ์ ์ด๋ป๊ฒ ์๊ฐ์ ํ๋ฅด๊ฒ ํด์ผํ ์ง ์กฐ๊ธ ๊ฐ์ ์ก์ ์ ์์๋ค.
์, ๋ค์ ๋์๊ฐ์ ์ฒ์๋ถํฐ ์๊ฐํด๋ณด์. ์ฐ์ left, right, mid๊ฐ ๋ฉ ์๋ฏธํ๋์ง ์ ์์์ผํ๋ค. ์ฐ๋ฆฌ๊ฐ ์ด๋ถํ์์ ํ๋ฉด์ ๊ตฌํ๋ ค๋ ๊ฐ์ mid ์ด๋ค. ์กฐ๊ฑด์ ๋ชจ๋ ๋ง์กฑํ๋ mid ๊ฐ์ ๊ตฌํ๋๊ฒ! ์ด๊ฒ์ ์๊พธ ๊น๋จน์ด์,,, ์๊ฐํ๊ธฐ๊ฐ ์ฝ์ง ์์๋ค. ์ด๋ฐ์ ์๊ฐํ๊ฒ ์ฒ๋ผ, ๋ ์ฌ์ด์ ๊ฐ๊ฒฉ์ left์ right์ผ๋ก ๋๋ฉด, mid๊ฐ์ด ํ๊ฒ๊ฐ์ด ๋์์๋! ์ฐ๋ฆฌ๋ ํด๋ฅผ ๊ตฌํ ์ ์๋ค. ๊ทธ๋ ๋ค๋ฉด, ์ฐ๋ฆฌ๋ ๊ฐ์ฅ ํฐ ๋ฒ์์ distance ๊ฐ ๋ ์ ์๋ ๊ฐ์ right๋ก ๋๊ณ , ๊ฐ์ฅ ์ ์ distance๊ฐ ๋์ฌ ์ ์๋ ๊ฑฐ๋ฆฌ๋ฅผ left๋ก ๋๋ฉด ๋์ง ์์๊น? ๊ทธ๋ฆฌ๊ณ mid๋ (left + right) / 2 ํด์ ๊ตฌํ ์ ์์ ๊ฒ์ด๋ค.
๊ทธ๋ผ, ํ์ฌ ์ํ์์๋ ๋์ 2๊ฐ๋ง ์ญ์ ํด์, ๋์ฌ์ด์ ๊ฑฐ๋ฆฌ์ ์ต์๊ฐ 12๊ฐ ๋์ด์ผํ๋ค. ๋๋ค์ ๋์๋ณด๋ฉด์ ํ๋จํด๋ณด๋ฉด,
1. ์ฒซ๋ฒ์งธ 2๋ฒ๋ → ๊ฐ๊ฒฉ์ 0~2๋๊น 2 → 2๋ mid์ธ 12๋ณด๋ค ์์ผ๋ฏ๋ก, 12๊ฐ ์ต์๊ฐ ๋ ์ ์์ → ์ญ์ ๋ ๋์ผ ๊ฒ์ด์ผ
2. ๋๋ฒ์งธ 11๋ฒ๋ → ๊ฐ๊ฒฉ์ 0 ~ 11๋๊น 11 (2๋ฒ๋์ ์ญ์ ๋์ด์ ์๋ค.) → 11์ mid์ธ 12๋ณด๋ค ์์ผ๋ฏ๋ก, 12๊ฐ ์ต์๊ฐ ๋ ์ ์์ → ์ญ์ ๋ ๋์ผ ๊ฒ์ด๋ ๋ง์ด๋ค
3. ์ธ๋ฒ์งธ 14๋ฒ๋ → ๊ฐ๊ฒฉ์ 0~14๋๊น 14 (2,12๋ฒ์ ์ญ์ ) → 14๋ mid์ธ 12๋ณด๋ค ํฌ๋ฏ๋ก, 12๊ฐ ์ต์๊ฐ ๋ ์ ์์ → ์ด๋์ ์ด๋ ค
4. ๋ค๋ฒ์งธ 21๋ฒ๋→ ๊ฐ๊ฒฉ์ 14 ~ 21๋๊น 7 → 7 < 12 → ์ด ๋๋ ์ฃฝ์ฌ์ผํด
....... ๐ ๋ฐ๋ณต
์ด๋ ๊ฒ ๋ ๊ฒ์ด๋ค. ์ด๋ถํ์์, mid ๊ฐ ์ผ๋จ ๋ฏธ๋ฆฌ ์ ํด์ง ๋ต์ด๋ผ๊ณ ์๊ฐํ๊ณ , ๊ทธ๋ค์ ํด๋ฅผ ๊ตฌํด๋ณด๊ณ ๊ทธ ํด๊ฐ ๋ด๊ฐ์ํ๋ ํด๊ฐ ์๋๋ผ๋ฉด? ์ฒ์๋ถํฐ ๋ค์ ๋ฏธ๋ฆฌ์ ํด์ง ๋ต์ ์ค์ ํ๋ค.๋ผ๊ณ ์ดํดํ๋ฉด ์ดํด๊ฐ ์ฌ์ธ ๊ฒ ๊ฐ๋ค. ํ์ฌ ์ด๊ฒ๋ mid์ธ 12๊ฐ ์ต์์ผ๊ฑฐ์ผ! ํ๊ณ ์ค์ ํด๋๊ณ , 12๊ฐ ์ต์๊ฐ ๋์ง ์๋ ๊ฐ๋ค์ ์๋ ๋์ผ๊ฑฐ์ผ~ ํ๊ณ ๋๋ค์ ์ญ์ ํ๋ค. ๊ฒฐ๊ตญ n๋ณด๋ค ๋ง์ ๋๋ค์ด ์ญ์ ๋๊ณ , ๊ทธ๋ ๋ค๋ฉด 12๋ ๋ต์ด ์๋๋ผ๋ ๋ป์ด ๋๋ค.
๊ทธ๋ผ,,, left ~ mid ์ mid~right ๋ฅผ ์ค์ ํ๋ ์กฐ๊ฑด์ ์ด๋ป๊ฒ์ค๊น? ์ด๊ฑด ์ญ์ ๋ ๋์ ๊ฐ์๋ฅผ ๋ณด์. ์์ ๊ฒฝ์ฐ์์ ์ญ์ ๋์ด์ผํ๋ ๋ , ์ฆ ์ฃผ์ด์ง n์ 2์ธ๋ฐ, ํ์ฌ 2๊ฐ ์ด์์ ๋์ด ์ญ์ ๋ ์ํ๋ค. ๊ทธ๋ ๋ค๋ฉด ์ต์๊ฐ๊ฒฉ 12๋ฅผ ์ค์ฌ์ผ ์ญ์ ๋๋ ๋์ ๊ฐ์๋ฅผ ์ค์ผ ์ ์์ ๊ฒ์ด๋ค.
mid = (left + right) / 2๋ก ์ค์ ๋์ด์์ผ๋, mid๋ฅผ ์ค์ด๊ธฐ ์ํด์๋ right๋ฅผ left์ชฝ์ผ๋ก ๋์ด์ค๋ ๋ฐฉ๋ฒ์ด ์๊ฒ ์ง? ๊ทธ๋ผ right๋ฅผ mid - 1๋ก ์ค์ ํด์ค ์ ์๊ฒ ๋ค.
์๋ ๋ ธํธ๋ ์์ ๊ณผ์ ์ ์ดํดํ๊ณ ์๊ฐํด๋ธ ์์ดํจ๋์์ ๋์ ์ฌ๋์ ๋ ธํธ์ด๋ค...
โซ๏ธ ์ ๊ทธ๋ผ ์ด๊ฒ์ ์ฝ๋๋ก ๊ตฌํํด์ ์ ์ถํด๋ณด์
import Foundation
func solution(_ distance:Int, _ rocks:[Int], _ n:Int) -> Int {
var rocks = rocks
rocks.append(0)
rocks.append(distance)
rocks.sort()
var left = 0
var right = distance
var answer = 0
while left <= right {
let mid = (left + right) / 2
var preRock = rocks[0]
var removeRock = 0
var minDistance = 1000000001
for i in 1..<rocks.count {
if rocks[i] - preRock < mid {
removeRock += 1
} else {
minDistance = min(rocks[i] - preRock, minDistance)
preRock = rocks[i]
}
}
if n >= removeRock {
answer = minDistance
left = mid + 1
} else {
right = mid - 1
}
}
return answer
}
์ญ? ํ ์ผ 2,3, ์๊ฐ์ด๊ณผ????
ํ์ด๋ฐฉ๋ฒ์ ํ๋ฆฐ๊ฒ ์๋ค๊ณ ํ์ ํ์ฌ sort๋๋ ๋ถ๋ถ์ ์ ์ฌํ ๋ดค๋ค. ํ๋ผ๋ฉํธ๋ฆญ ์์น (์ด๋ถํ์)์ ์งํํ ๋๋ ์ ๋ ฌ๋์ด์๋ ๋ฐฐ์ด์ ์ฌ์ฉํด์ผํ๊ธฐ ๋๋ฌธ์ sortํ๋๋ฐ ์๊ฐ์ด ๋ ๊ฑธ๋ฆด ๊ฒ์ด๋ผ๊ณ ํ๋จํ๋ค.
์ฌ๊ธฐ์ ์ธ๋ฐ ์๋ ์ฝ๋๋ฅผ ๋ฐ๊ฒฌํ๋ค. sort๋ฅผ ๋ค๋ฅธ ๋ฉ์๋๋ก ๋ฐ๊ฟ์ผํ๋? nlogn์ ๋ณด์ฅํ๋ ๊ฒ์ผ๋ก ๋ฐ๊ฟ์ผํ๋? ์ถ์๋๋ฐ, ์๋๊ฒ ๊ฐ์๊ณ , ๋ด๊ฐ append ๋ก 0๊ณผ distance๋ฅผ ๋ ๋ฃ์ด์ค์ผ๋ก์จ sortํ๋ ์๊ฐ์ด ๋ ๊ฑธ๋ฆฌ๋ ๊ฒ ๊ฐ์๋ค. ์ฌ์ค ์ ์ด์ left์ right๋ ๊ทธ๋ฅ 0๊ณผ distance ์์๊ฐ์ผ๋ก ์ค์ ํด์ฃผ๋ฉด ๋๋ ๊ฒ์ด๊ณ , ๊ตณ์ด rocks์ ์ถ๊ฐํ์ง ์์๋ ๋๋ค. rocks์ ์๋ก์ด ๊ฐ์ ์ถ๊ฐํด์ค์ผ๋ก์จ ๋ง์ฝ rocks์ ๋ฐฐ์ด์ด ์์ฃผ ํฌ๊ฒ ๋ค์ด์ค๊ฒ ๋์๋, ๋๊ฐ์ ๊ฐ์ ๋ ์ถ๊ฐํด์ค์ผ๋ก์จ, ์ ๋ ฌํ๋๋ฐ ์๊ฐ์ด n๋ฒ ๋ ๊ฑธ๋ฆด ๊ฒ์ด๋ค. ์ด๊ฒ ๋๋ฌธ์ ์ด๊ณผํ์ง ์์์๊น?
์ญ์๋! ์ด๊ฑฐ ๊ณ ์น๋๊น ํด๊ฒฐ์๋ฃ ๋๋๊ตฐ
โซ๏ธ ์ ๋ต์ฝ๋
import Foundation
func solution(_ distance:Int, _ rocks:[Int], _ n:Int) -> Int {
let rocks = rocks.sorted()
var left = 0
var right = distance
var answer = 0
while left <= right {
let mid = (left + right) / 2
var preRock = 0
var removeRock = 0
var minDistance = 1000000001
for rock in rocks {
if rock - preRock < mid {
removeRock += 1
} else {
minDistance = min(rock - preRock, minDistance)
preRock = rock
}
}
if n >= removeRock {
answer = minDistance
left = mid + 1
} else {
right = mid - 1
}
}
return answer
}
์, ์ด์ ์์ผ๋ก ์ด๋ถํ์ ๋ฌธ์ ๋ฅผ ํ๋ ๊ธฐ์ตํด์ผํ๋ ๊ฒ์ ์ด๊ฒ์ด๋ค.
์ฐ๋ฆฌ๊ฐ ์ด๋ถํ์์ผ๋ก ๊ตฌํ๋ ค๊ณ ํ๋ mid ํ๊ฒ๊ฐ์ 'ํด'์ด๊ณ , ํ๋ผ๋ฉํธ๋ฆญ ์์น๋ก ์ด ํด๊ฐ ๋ง๋์ง ์๋์ง ํ์ธํ๋ค. mid๊ฐ ํด ๋ผ๋๊ฒ์ ์์ง ๋ง์!