Problem
Solution
ํด๋น ๋ฌธ์ ๋ ์์ ํ์ ๋ฌธ์ ์ ๋๋ค.
๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํ์ํด์ผ ์ ๋ต์ ์ ์ ์๋ ๋ฌธ์ ์ ๋๋ค.
ํ์ง๋ง ํจ์จ์ ์ผ๋ก ํ์ํ๊ธฐ ์ํด ์ฃผ์ด์ง ๋ฌธ์๋ฅผ ๊ธด ๋ฌธ์์ด์์ ์งง์ ๋ฌธ์์ด๋ก ์๋ผ์ ๋น๊ตํ๋๊ฒ ํต์ฌ์ ๋๋ค.
1. ์ด๊ธฐ๊ฐ ์ค์
์ธ๋ฑ์ค๋ฅผ ์ฐพ๊ธฐ ์ฝ๊ฒ ๋ฌธ์์ด์ ๋งคํํ ๊ฐ๊ณผ ๊ฐ์ฅ ๊ธด ๊ฐ์ ์ด๊ธฐ๊ฐ์ ์ค์ ํด์ค๋๋ค.
//๋ฌธ์์ด ์ธ๋ฑ์ค๋ฅผ ์ฐพ๊ธฐ ์ฝ๊ฒ ๋งคํํด์ค
let str:[String] = s.map{String($0)}
//๊ฐ์ฅ ๊ธด ๊ธธ์ด ์ด๊ธฐ๊ฐ ์ค์
var maxLength:Int = 1
2. ์ด์ค for๋ฌธ์ผ๋ก ์ฃผ์ด์ง ๋ฌธ์์ด์ ์ํ
๋ฐ๊นฅ์ชฝ for๋ฌธ์ 0๋ถํฐ ์ฐจ๋ก๋๋ก
์์ชฝ for๋ฌธ์ ๋ฐ๋๋ก ๋งจ ๋ ์ธ๋ฑ์ค๋ถํฐ ์ํ๋ฅผ ํด์ค๋๋ค.
for i in 0..<str.count-1 {
for j in stride(from: str.count-1, to: i+1, by: -1) {
3. ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ์ค์
๋ฌธ์์ด์ ๊ธธ์ด๋ j-1+1๋ก ๊ณ ์
var length = j-i+1
4. ๋ฌธ์์ด์ ๊ธธ์ด๊ฐ ํ์์ธ์ง ์ง์์ธ์ง์ ๋ฐ๋ผ ์ค๊ฐ๊ฐ ์ค์
๋ง์ฝ ๋ฌธ์์ด์ด ์ง์์ผ ๊ฒฝ์ฐ ex) abcefg
abc์ efg๋ฅผ ๋น๊ตํด์ผ ํ๋ฏ๋ก ์ค๊ฐ๊ฐ์ c๊ฐ ๋ฉ๋๋ค.
๋ง์ฝ ๋ฌธ์์ด์ด ํ์์ผ ๊ฒฝ์ฐ ex) abcde
ab์ de๋ฅผ ๋น๊ตํด์ผ ํ๋ฏ๋ก ๊ฐ์ด๋ฐ ๋ฌธ์์ด์ธ c๊ฐ ์ค๊ฐ๊ฐ์ด ๋ฉ๋๋ค.
let middle = length%2 != 0 ? length/2 - 1 : length/2
5. ์ค๊ฐ๊ฐ์ ๊ธฐ์ค์ผ๋ก ํ๋๋ ์ฒ์๋ถํฐ ํ๋๋ ๋๋ถํฐ ๋น๊ต
i๋ ์ฒซ๋ฒ์งธ๊ฐ j๋ ๋งจ ๋ ๊ฐ์ด๋ฏ๋ก ์ฌ๊ธฐ์ ์ค๊ฐ๊ฐ์ ๋ํ๊ณ ๋นผ์ ๋น๊ตํด์ค๋๋ค.
๋ง์ฝ ์๋๋ผ๋ฉด length์ ๊ฐ์ ๋ณํ์์ผ ์๋ ค์ค๋๋ค.
for m in 0...middle {
//์ผ์ชฝ์ ์ฒซ๋ฒ์งธ๋ถํฐ ์ค๋ฅธ์ชฝ์ ๋ง์ง๋ง๋ถํฐ ๋น๊ต
if str[i+m] != str[j-m] {
//๋ง์ฝ ๊ฐ์ด ๋ค๋ฅด๋ค๋ฉด length์ +1์ ํด์ ์๋ ค์ค
length += 1
break
}
}
6. ํฐ๋ฆฐ๋๋กฌ์ด๋ผ๋ฉด ๊ฐ์ฅ ๊ธด ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ๊ฐฑ์
length์ ๊ธธ์ด๊ฐ ๊ทธ๋๋ก๋ผ๋ฉด ํฐ๋ฆฐ๋๋กฌ์ด๋ฏ๋ก ํ์ฌ ๊ธธ์ด์ maxLength๋ฅผ ๋น๊ตํด์ ๋ ๊ธด ๊ฐ์ผ๋ก ์ค์ ํด์ค๋๋ค.
if length == j-i+1 {
//๊ฐ์ฅ ๊ธด ๊ธธ์ด์ ํ์ฌ ๊ธธ์ด๋ฅผ ๋น๊ตํด์ ๋ฃ์ด์ค
maxLength = max(maxLength,length)
}
7. ๊ฐ์ฅ ๊ธด ๊ธธ์ด๋ฅผ ๋ฐํ
return maxLength
Source Code
๋ฐฐ์ด์
๋ค์ง์ ๋ฌธ์์ด์ด ๋๊ฐ์์ง๋ฅผ ๋น๊ตํ ๋ reversed๋ฅผ ์ฌ์ฉํ๋๋ฐ ๊ทธ๊ฒ ํจ์ฌ ๋นํจ์จ์ ์ด๊ณ
๋ํ ๋น๊ตํ๊ธฐ ์ํด์ ArraySlice[1...n] ๋ฑ์ผ๋ก ์๋ผ์ ๋น๊ต๋ฅผ ํ๋๋ฐ ์ด๋ฐ์์ผ๋ก ํ ๊ฒฝ์ฐ
ํจ์ฌ ๋นํจ์จ์ ์ด๋ค.
ํ๋์ฉ ๋น๊ตํ๋๊ฒ ํจ์จ์ ์.
์ฒ์๋ถํฐ ๋๊น์ง ๋น๊ตํ๋ฉด ์์ ๋นํจ์จ์ ์ด๊ฒ ์ง? ๋ผ๊ณ ์๊ฐํด์ ๊ฐ์ด๋ฐ๋ถํฐ ํฌ์ธํฐ๋ฅผ ๋๊ฐ์ก์์ ์์ชฝ์ผ๋ก ํผ์ง๋ฉด์
๊ฒ์ฌ๋ฅผ ํ๋ คํ๋๋ฐ ์คํ๋ ค ๊ทธ๋ฅ ์ฒ์๋ถํฐ ๋น๊ตํด๋ ๋์.
๋๊ธ