๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“– Problem Solution/Programmers

[Swift] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๊ฐ€์žฅ ๊ธด ํŒฐ๋ฆฐ๋“œ๋กฌ

by Fomagran ๐Ÿ’ป 2021. 6. 22.
728x90
๋ฐ˜์‘ํ˜•

 

Problem

 

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๊ฐ€์žฅ ๊ธด ํŒฐ๋ฆฐ๋“œ๋กฌ

์•ž๋’ค๋ฅผ ๋’ค์ง‘์–ด๋„ ๋˜‘๊ฐ™์€ ๋ฌธ์ž์—ด์„ ํŒฐ๋ฆฐ๋“œ๋กฌ(palindrome)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด s๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, s์˜ ๋ถ€๋ถ„๋ฌธ์ž์—ด(Substring)์ค‘ ๊ฐ€์žฅ ๊ธด ํŒฐ๋ฆฐ๋“œ๋กฌ์˜ ๊ธธ์ด๋ฅผ return ํ•˜๋Š” solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด ์ฃผ์„ธ์š”. ์˜ˆ๋ฅผ๋“ค

programmers.co.kr


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] ๋“ฑ์œผ๋กœ ์ž˜๋ผ์„œ ๋น„๊ต๋ฅผ ํ–ˆ๋Š”๋ฐ ์ด๋Ÿฐ์‹์œผ๋กœ ํ•  ๊ฒฝ์šฐ

 

ํ›จ์”ฌ ๋น„ํšจ์œจ์ ์ด๋‹ค.

 

ํ•˜๋‚˜์”ฉ ๋น„๊ตํ•˜๋Š”๊ฒŒ ํšจ์œจ์ ์ž„.

 

์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋น„๊ตํ•˜๋ฉด ์™„์ „ ๋น„ํšจ์œจ์ ์ด๊ฒ ์ง€? ๋ผ๊ณ  ์ƒ๊ฐํ•ด์„œ ๊ฐ€์šด๋ฐ๋ถ€ํ„ฐ ํฌ์ธํ„ฐ๋ฅผ ๋‘๊ฐœ์žก์•„์„œ ์–‘์ชฝ์œผ๋กœ ํผ์ง€๋ฉด์„œ

 

๊ฒ€์‚ฌ๋ฅผ ํ•˜๋ คํ–ˆ๋Š”๋ฐ ์˜คํžˆ๋ ค ๊ทธ๋ƒฅ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋น„๊ตํ•ด๋„ ๋์Œ.

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€