Problem
Solution
์ด๋ฒ ๋ฌธ์ ์ ํต์ฌ์ ์คํ์ ์ด์ฉํด์ ํ์ด์ผ ํ๋ ๊ฒ ์ ๋๋ค.
1. ๋ฌธ์์ด์ ๋ชจ๋ "110" ์ญ์ ํด์ค๋ค.
์ฌ๊ธฐ์ ์คํ์ ์ฌ์ฉํ์ง ์์ผ๋ฉด 4๋ฒ,18๋ฒ,19๋ฒ,21๋ฒ ์์ ์๊ฐ์ด๊ณผ๊ฐ ๋๊ฒ ๋ฉ๋๋ค.
๋ฌธ์ ํ๋์ ์์ผ๋ฉฐ ๊ฐ์ฅ ๋ง์ง๋ง ๋ ๊ธ์์ ํ์ฌ ๊ธ์๋ฅผ ๋น๊ตํด์ "110" ์ด๋ผ๋ ๋ฌธ์๊ฐ ๋์ค๋ฉด
์คํ์ ๊ฐ์ฅ ๋ง์ง๋ง ๋ ๋ฌธ์๋ฅผ ์ง์์ค๋๋ค.
"110"์ ์ง์ ์ ๋ ๊ทธ ์ด์ ์ ์๋ ๋ฌธ์์ ์ดํ์ ์๋ ๋ฌธ์๊ฐ ํฉ์ณ์ ธ์
๋ "110"์ด๋ผ๋ ๋ฌธ์์ด์ ๋ง๋ค ์ ์์ผ๋ฏ๋ก ์คํ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
ex) 111111100 -> 111110 -> 111
๊ทธ๋ฆฌ๊ณ ๋์ค์ 110์ ์ถ๊ฐํด์ค์ผ ํ๋ฏ๋ก ๋ํด์ ๋ฐ๋ก ์ ์ฅํด์ค๋๋ค.
func remove110(str:String,add:inout String) -> [String] {
var stack:[String] = []
for s in str {
if stack.count >= 2 && stack[stack.count-2] == "1" && stack[stack.count-1] == "1" && s == "0" {
stack.removeLast()
stack.removeLast()
add += "110"
continue
}
stack.append(String(s))
}
return stack
}
2. 1์์ "110"์ ์ง์ด ๋ฌธ์์ ๊ฐ์ฅ ๋ง์ง๋ง "0"์ ์ฐพ์๋ธ๋ค.
์ฌ์ ์ ๊ฐ์ฅ ์์ ์ค๊ธฐ ์ํ ๊ท์น์ ๋ชจ๋ "110"์ ์ ๊ฑฐํ ๋ฌธ์์์ ๊ฐ์ฅ ๋ง์ง๋ง "0"์ "110"์ ๋ํ๋ฉด ๋ฉ๋๋ค.
๊ณ ๋ก ๊ฐ์ฅ ๋ง์ง๋ง "0"์ด ์๋ index๋ฅผ ์ฐพ์์ค๋๋ค.
func findLast0(str:[String]) -> Int {
for i in stride(from: str.count-1, through: 0, by: -1) {
if str[i] == "0" {
return i+1
}
}
return 0
}
3. "110"์ ์ง์์ค ๋ฌธ์์ด์ ๊ฐ์ฅ ๋ง์ง๋ง "0"์ด ์๋ ์ธ๋ฑ์ค์ "110"๋ค์ ์ถ๊ฐํด์ค๋ค.
"110"์ ์ง์ธ ๋ ์ ์ฅํด๋์ add๋ฅผ ๊ฐ์ฅ ๋ง์ง๋ง "0"์ด ์๋ index์ ์ถ๊ฐํด์ค๋๋ค.
func insert110ToRemoveString(str:String) -> String {
var add:String = ""
var removeString = remove110(str: str,add: &add)
let index = findLast0(str: removeString)
removeString.insert(add, at: index)
return removeString.joined()
}
4. s์ ๋ด๊ธด ๋ชจ๋ ๋ฌธ์๋ฅผ ์์ ๊ฐ์ด ๋ฐ๋ณตํด์ ๋ฐํํ๋ค.
func solution(_ s:[String]) -> [String] {
return s.map{insert110ToRemoveString(str: $0)}
}
Source Code
P.S
"110"์ ์ง์ฐ๋ ๊ณผ์ ์์ ์คํ์ ์ฌ์ฉํ์ง ์๊ณ while๋ฌธ์ ์ฌ์ฉํ์ฌ 110์ ์ง์ฐ๊ณ break๋ฅผ ๊ฑธ๊ณ
๋ค์ ์ง์ฐ๊ณ ํ๋ฉด์ "110"์ด ์์ ๋๊น์ง ๋ฐ๋ณตํ๋๋ 8๋ฒ,19๋ฒ,21๋ฒ์์ ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๋ค...
ํ์ด๋ฒ์ ์คํ์ ์ฌ์ฉํด์ผ ํ๋ค๋ ๊ฒ์ ๋ณด๊ณ ํด๊ฒฐํ๋๋ฐ... ์ ๋ง ํ ๋ ์ฐจ์ด๋ก ์ ๋ต์ธ์ง ์๋์ง๊ฐ ๊ฐ๋ฆฌ๋ ๊ฒ ๊ฐ๋ค...
๋๊ธ