Algorithm
[Algorithm][KAKAO] ๊ดํธ ๋ณํ
_๋ณด๋ฆ
2021. 4. 19. 22:30
๐ฅ ๋ฌธ์
'(' ์ ')' ๋ก๋ง ์ด๋ฃจ์ด์ง ๋ฌธ์์ด w๊ฐ "๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด" ์ด๋ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ํตํด "์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด"๋ก ๋ณํํ ์ ์์ต๋๋ค.
- ์ ๋ ฅ์ด ๋น ๋ฌธ์์ด์ธ ๊ฒฝ์ฐ, ๋น ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค.
- ๋ฌธ์์ด w๋ฅผ ๋ "๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด" u, v๋ก ๋ถ๋ฆฌํฉ๋๋ค. ๋จ, u๋ "๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด"๋ก ๋ ์ด์ ๋ถ๋ฆฌํ ์ ์์ด์ผ ํ๋ฉฐ, v๋ ๋น ๋ฌธ์์ด์ด ๋ ์ ์์ต๋๋ค.
- ๋ฌธ์์ด u๊ฐ "์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด" ์ด๋ผ๋ฉด ๋ฌธ์์ด v์ ๋ํด 1๋จ๊ณ๋ถํฐ ๋ค์ ์ํํฉ๋๋ค.
3-1. ์ํํ ๊ฒฐ๊ณผ ๋ฌธ์์ด์ u์ ์ด์ด ๋ถ์ธ ํ ๋ฐํํฉ๋๋ค. - ๋ฌธ์์ด u๊ฐ "์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด"์ด ์๋๋ผ๋ฉด ์๋ ๊ณผ์ ์ ์ํํฉ๋๋ค.
4-1. ๋น ๋ฌธ์์ด์ ์ฒซ ๋ฒ์งธ ๋ฌธ์๋ก '('๋ฅผ ๋ถ์ ๋๋ค.
4-2. ๋ฌธ์์ด v์ ๋ํด 1๋จ๊ณ๋ถํฐ ์ฌ๊ท์ ์ผ๋ก ์ํํ ๊ฒฐ๊ณผ ๋ฌธ์์ด์ ์ด์ด ๋ถ์ ๋๋ค.
4-3. ')'๋ฅผ ๋ค์ ๋ถ์ ๋๋ค.
4-4. u์ ์ฒซ ๋ฒ์งธ์ ๋ง์ง๋ง ๋ฌธ์๋ฅผ ์ ๊ฑฐํ๊ณ , ๋๋จธ์ง ๋ฌธ์์ด์ ๊ดํธ ๋ฐฉํฅ์ ๋ค์ง์ด์ ๋ค์ ๋ถ์ ๋๋ค.
์์ฑ๋ ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค."๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด" p๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ์ฃผ์ด์ง ์๊ณ ๋ฆฌ์ฆ์ ์ํํด "์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด"๋ก ๋ณํํ ๊ฒฐ๊ณผ๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด ์ฃผ์ธ์.
๐ค ํ์ด ๋ฐฉ๋ฒ
func split(_ arr:[String]) -> String {}
- ๋ฌธ์์ด์ ๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด u์ v๋ก ๋ถ๋ฆฌํ๋ค.
func convert(_ u:[String], _ v:[String]_ -> String {}
- ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ธ์ง ํ์ธํ๊ณ ์๋ ๊ฒฝ์ฐ ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด๋ก ๋ณํํ๋ค.
๐ฉ๐ป๐ป Swift Code
import Foundation
func solution(_ p:String) -> String {
let p = p.map{String($0)}
// step 1
if p == [] {
return ""
}
return split(p)
}
// step 2
func split(_ arr:[String]) -> String {
var arr = arr
var u: [String] = []
var v: [String] = []
while arr != [] {
var balance = 1
u.append(arr.removeFirst())
while balance != 0 {
if arr.first! == u[0] {
balance += 1
} else {
balance -= 1
}
u.append(arr.removeFirst())
}
v = arr
arr = []
}
return convert(u, v)
}
func convert(_ u:[String], _ v:[String]) -> String {
if u == [] {
return ""
}
var u = u
// step 3
var tmp: [String] = []
for i in 0..<u.count {
if u[i] == "(" {
tmp.append("(")
} else if tmp != [] {
tmp.removeLast()
}
}
if tmp == [] {
// step 3-1
return u.reduce("", +) + split(v)
} else {
// step 4
u.removeFirst()
u.removeLast()
// step 4-4
for i in 0..<u.count {
if u[i] == "(" {
u[i] = ")"
} else {
u[i] = "("
}
}
return "(" + split(v) + ")" + u.reduce("", +)
}
}
์ฝ๋ฉํ ์คํธ ์ฐ์ต - ๊ดํธ ๋ณํ
์นด์นด์ค์ ์ ์ ๊ฐ๋ฐ์๋ก ์ ์ฌํ "์ฝ"์ ์ ๋ฐฐ ๊ฐ๋ฐ์๋ก๋ถํฐ ๊ฐ๋ฐ์ญ๋ ๊ฐํ๋ฅผ ์ํด ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์์ฑํ ์์ค ์ฝ๋๋ฅผ ๋ถ์ํ์ฌ ๋ฌธ์ ์ ์ ๋ฐ๊ฒฌํ๊ณ ์์ ํ๋ผ๋ ์ ๋ฌด ๊ณผ์ ๋ฅผ ๋ฐ์์ต๋๋ค. ์์ค๋ฅผ
programmers.co.kr