Problem
Solution
1. ์ฐ์๋ ๋ฐฉ๋ค์ ์์๊ณผ ๊ธธ์ด๋ฅผ ์ ์ฅํด ๋์ ํด๋์ค๋ฅผ ๋ง๋ ๋ค.
์ด ๋ฌธ์ ์ ํต์ฌ์ ํฌ์์ ์ํ๋ ๋ฐฉ์ด ์ค๋ณต๋์์ ๋ ํด๋น ๋ฐฉ๋ณด๋ค ํฌ๋ฉด์ ๊ฐ์ฅ ์์ ๋ฐฉ์ ์ฐพ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
์ฐ์๋ ๋ฐฉ์ ๊ธธ์ด์ ์์๋ ๋ฐฉ์ ์์น๋ฅผ ๋ํด์ฃผ๋ฉด ์ฝ๊ฒ ์ฐพ์ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค๋ฉด 10๊ฐ์ ๋ฐฉ ์ค 2,3,4,5 ๊ฐ ์ด๋ฏธ ์ฐจ์๋ค๋ฉด ์์๋ ๋ฐฉ์ ์์น๋ 2์ด๊ณ ์ฐ์๋ ๋ฐฉ์ ๊ธธ์ด๋ 4์ ๋๋ค.
๊ณ ๋ก 2,3,4,5 ์ค์ ์ค๋ณต๋ ๋ฐฉ์ด ์๋ค๋ฉด 2(์์๋ ๋ฐฉ์ ์์น) + 4(์ฐ์๋ ๋ฐฉ์ ๊ธธ์ด) = 6์ด๋ฏ๋ก 6๋ฒ ๋ฐฉ์ ๋ฃ์ผ๋ฉด ๋ฉ๋๋ค.
class Room {
var root:Int64,length:Int64
init(root:Int64,length:Int64) {
self.root = root
self.length = length
}
}
2. ๋ฐฉ์ด ๋น์ด์๊ณ ์ผ์ชฝ ๋ฐฉ์ด ๋น์ด์์ง ์์ ๊ฒฝ์ฐ๋ฅผ ์ ๋ฐ์ดํธ ํ๋ค.
ํฌ์๋ ๋ฐฉ์ด ๋น์ด์๊ณ , ์ผ์ชฝ ๋ฐฉ์ด ๋น์ด์์ง ์๋ค๋ฉด ํฌ์๋ ๋ฐฉ๊ณผ ์ผ์ชฝ ๋ฐฉ์ ์ฐ๊ฒด์์ผ ์ฃผ์ด์ผ ํฉ๋๋ค.
์ฆ, ํ์ฌ ํฌ์๋ ๋ฐฉ์ ์์ ๋ฒํธ๋ฅผ ์ผ์ชฝ ๋ฐฉ์ ์์ ๋ฒํธ๋ก ๋ฐ๊พธ๊ณ ์ฐ์๋ ๋ฐฉ์ ๊ธธ์ด๋ฅผ ์ผ์ชฝ ๋ฐฉ์ ๊ธธ์ด์ +1(ํ์ฌ ๋ฐฉ)์ผ๋ก ์ ๋ฐ์ดํธ ํด์ค๋๋ค.
func updateLeftSide(_ n:Int64) {
dic[n-1]!.length += 1
dic[n] = dic[n-1]!
}
3. ๋ฐฉ์ด ๋น์ด์๊ณ ์ค๋ฅธ์ชฝ ๋ฐฉ์ด ๋น์ด์์ง ์์ ๊ฒฝ์ฐ๋ฅผ ์ ๋ฐ์ดํธ ํ๋ค.
ํฌ์๋ ๋ฐฉ์ด ๋น์ด์๊ณ , ์ค๋ฅธ์ชฝ ๋ฐฉ์ด ๋น์ด์์ง ์๋ค๋ฉด ํฌ์๋ ๋ฐฉ์ ์์์ผ๋ก ํ๊ณ ์ค๋ฅธ์ชฝ ๋ฐฉ๊ณผ ์ฐ๊ฒฐ์์ผ ์ฃผ์ด์ผ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐฉ์ ๊ธธ์ด๋ฅผ + 1(ํ์ฌ ๋ฐฉ)์ผ๋ก ์ ๋ฐ์ดํธ ํด์ค๋๋ค.
func updateRightSide(_ n:Int64) {
dic[n+1]!.length += 1
dic[n+1]!.root = n
dic[n] = dic[n+1]!
}
4. ๋ฐฉ์ด ๋น์ด์๊ณ ์ค๋ฅธ์ชฝ๊ณผ ์ผ์ชฝ์ด ๋ชจ๋ ๋น์ด์์ง ์์ ๊ฒฝ์ฐ๋ฅผ ์ ๋ฐ์ดํธ ํ๋ค.
ํฌ์๋ ๋ฐฉ์ด ๋น์ด์๊ณ ์ผ์ชฝ ๋ฐฉ๊ณผ ์ค๋ฅธ์ชฝ ๋ฐฉ์ด ๋น์ด์์ง ์๋ค๋ฉด ํ์ฌ ๋ฐฉ๊ณผ ์ค๋ฅธ์ชฝ ๋ฐฉ์ ์์์ ์ผ์ชฝ ๋ฐฉ์ ์์ ๋ฒํธ ๋ฐ๊พธ๊ณ ,
์ผ์ชฝ๋ฐฉ์ ๊ธธ์ด์ ์ค๋ฅธ์ชฝ ๋ฐฉ์ ๊ธธ์ด + 1(ํ์ฌ๋ฐฉ)์ผ๋ก ์ ๋ฐ์ดํธ ํด์ค์ผ ํฉ๋๋ค.
func updateBothSide(_ n:Int64) {
let newLength = dic[n-1]!.length + dic[n+1]!.length + 1
dic[n-1]!.length = newLength
dic[n+1]! = dic[n-1]!
dic[n] = dic[n-1]
}
5. ๋ฐฉ์ด ๋น์ด์์ง ์์ ๊ฒฝ์ฐ๋ฅผ ์ ๋ฐ์ดํธ ํ๋ค.
๋ฐฉ์ด ๋น์ด์์ง ์์ ๊ฒฝ์ฐ๋ 1๋ฒ์์ ์ ํ ๊ท์น๋๋ก ๋ฐฉ์ ์์น๋ฅผ ์ ํฉ๋๋ค.
ํ์ง๋ง ์๋กญ๊ฒ ์ ํด์ง ๋ฐฉ์ ์์น ๋ํ 2,3,4๋ฒ์ผ๋ก ์ ์ชฝ์ ๋ฐฉ์ด ๋น์ด์๋์ง ํ์ธํด์ค ๋ค ์ ๋ฐ์ดํธ ํด์ค๋๋ค.
func updateOverlap(_ n:Int64) {
let newNumber = dic[n]!.root + dic[n]!.length
check(newNumber)
}
* check
func check(_ n:Int64) {
if dic[n] == nil {
if dic[n-1] != nil && dic[n+1] != nil{
updateBothSide(n)
}else if dic[n-1] != nil {
updateLeftSide(n)
}else if dic[n+1] != nil {
updateRightSide(n)
}else {
dic[n] = Room(root: n, length: 1)
}
result.append(n)
}else {
updateOverlap(n)
}
}
Source Code
'๐ Problem Solution > Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] 2019 KAKAO BLIND RECRUITMENT ๋ธ๋ก ๊ฒ์ (0) | 2022.03.28 |
---|---|
[Swift] ํ๋ก๊ทธ๋๋จธ์ค ์ฌ๋ฐ๋ฅธ ๊ดํธ์ ๊ฐฏ์ (0) | 2022.03.06 |
[JS] ํ๋ก๊ทธ๋๋จธ์ค 124 ๋๋ผ์ ์ซ์ (0) | 2022.02.14 |
[JS] ํ๋ก๊ทธ๋๋จธ์ค ํฐ์ผ๋ชฌ (0) | 2022.02.06 |
[Swift] 2022 KAKAO BLIND RECRUITMENT ์ฌ๋ผ์ง๋ ๋ฐํ (0) | 2022.01.20 |
๋๊ธ