๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
3๏ธโƒฃ Swift/Problem Solving

[Swift Algorithm] ์‹œ์ € ์•”ํ˜ธ Programmers(Lv.1)

by seolhee2750 2021. 6. 14.
๋ฌธ์ œ ์„ค๋ช…

์–ด๋–ค ๋ฌธ์žฅ์˜ ๊ฐ ์•ŒํŒŒ๋ฒณ์„ ์ผ์ •ํ•œ ๊ฑฐ๋ฆฌ๋งŒํผ ๋ฐ€์–ด์„œ ๋‹ค๋ฅธ ์•ŒํŒŒ๋ฒณ์œผ๋กœ ๋ฐ”๊พธ๋Š” ์•”ํ˜ธํ™” ๋ฐฉ์‹์„ ์‹œ์ € ์•”ํ˜ธ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "AB"๋Š” 1๋งŒํผ ๋ฐ€๋ฉด "BC"๊ฐ€ ๋˜๊ณ , 3๋งŒํผ ๋ฐ€๋ฉด "DE"๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. "z"๋Š” 1๋งŒํผ ๋ฐ€๋ฉด "a"๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด s์™€ ๊ฑฐ๋ฆฌ n์„ ์ž…๋ ฅ๋ฐ›์•„ s๋ฅผ n๋งŒํผ ๋ฏผ ์•”ํ˜ธ๋ฌธ์„ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜, solution์„ ์™„์„ฑํ•ด ๋ณด์„ธ์š”.

 

์ œํ•œ ์กฐ๊ฑด
  • ๊ณต๋ฐฑ์€ ์•„๋ฌด๋ฆฌ ๋ฐ€์–ด๋„ ๊ณต๋ฐฑ์ž…๋‹ˆ๋‹ค.
  • s๋Š” ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž, ๋Œ€๋ฌธ์ž, ๊ณต๋ฐฑ์œผ๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
  • s์˜ ๊ธธ์ด๋Š” 8000์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • n์€ 1 ์ด์ƒ, 25์ดํ•˜์ธ ์ž์—ฐ์ˆ˜์ž…๋‹ˆ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ
s n result
"AB" 1 "BC"
"z" 1 "a"
"a B z" 4 "e F d"

 

๋‚ด ๋ฌธ์ œ ํ’€์ด
func solution(_ s:String, _ n:Int) -> String {
    let upperString = Array("abcdefghijklmnopqrstuvwxyz".uppercased())
    let lowerString = Array("abcdefghijklmnopqrstuvwxyz")
    let inputString = Array(s)
    var result = ""
   
    for i in inputString {
        // ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์˜ i๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ ๋Œ€๋ฌธ์ž ๋ฐฐ์—ด์— ํฌํ•จ๋˜์—ˆ์„ ๊ฒฝ์šฐ
        if upperString.contains(i) {
            // ๋Œ€๋ฌธ์ž ๋ฐฐ์—ด์—์„œ ํ•ด๋‹น ๋ฌธ์ž์˜ ์œ„์น˜๋ฅผ ์ฐพ๊ณ , ๊ทธ ์œ„์น˜์— n์„ ๋”ํ•œ ๊ฐ’์„ ์ €์žฅ
            var indexNum = upperString.firstIndex(of: i)! + n
            
            // ์ €์žฅ๋œ ์œ„์น˜๊ฐ€ 25๋ณด๋‹ค ํด ๊ฒฝ์šฐ, 26์„ ๋นผ์คŒ์œผ๋กœ์จ ๋‹ค์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ ์œ„์น˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก
            if indexNum > 25 {
                indexNum = indexNum - 26
            }

            // ๋Œ€๋ฌธ์ž ๋ฐฐ์—ด์—์„œ ์ฐพ์€ ์œ„์น˜์˜ ๋ฌธ์ž๋ฅผ result ๋ฐฐ์—ด์— ์ถ”๊ฐ€
            result.append(upperString[indexNum])
        }
        
        // ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์˜ i๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ ์†Œ๋ฌธ์ž ๋ฐฐ์—ด์— ํฌํ•จ๋˜์—ˆ์„ ๊ฒฝ์šฐ
        else if lowerString.contains(i) {
            var indexNum = lowerString.firstIndex(of: i)! + n
            
            if indexNum > 25 {
                indexNum = indexNum - 26
            }
            
            result.append(lowerString[indexNum])
        }
        
        // ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์˜ i๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ ๊ณต๋ฐฑ์ผ ๊ฒฝ์šฐ
        else {
            result.append(i)
        }
    }
    return result
}
  • ์†Œ๋ฌธ์ž, ๋Œ€๋ฌธ์ž ๋ฐฐ์—ด์„ ๊ฐ๊ฐ ์ƒ์„ฑํ•ด์ฃผ์—ˆ๋‹ค.
  • ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์˜ i ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ ๋Œ€๋ฌธ์ž์ธ์ง€ ์†Œ๋ฌธ์ž์ธ์ง€ ํŒ๋ณ„ํ•˜๊ณ  ์ƒ์„ฑํ•œ ์†Œ๋ฌธ์ž ๋Œ€๋ฌธ์ž ๋ฐฐ์—ด์—์„œ ์œ„์น˜๋ฅผ ์ฐพ์•˜๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์ฐพ์€ ์œ„์น˜์— n์„ ๋”ํ•ด์ฃผ์–ด ์ƒˆ๋กœ์šด ์œ„์น˜์˜ ๋ฌธ์ž๋ฅผ result์— ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋Š”๋ฐ,
    ๋งŒ์•ฝ ๋”ํ•œ ๊ฐ’์ด ์•ŒํŒŒ๋ฒณ ๊ฐœ์ˆ˜์ธ 26๊ฐœ๋ฅผ ๋„˜์œผ๋ฉด ๋‹ค์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ ์œ„์น˜๋ฅผ ์ฐพ์•„์ฃผ๊ธฐ ์œ„ํ•ด 26์„ ๋นผ์ฃผ์—ˆ๋‹ค.
  • ๊ณต๋ฐฑ์ผ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋Œ€๋กœ ๊ณต๋ฐฑ์„ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.

 

์ธ์ƒ์ ์ธ ํ’€์ด
func solution(_ s:String, _ n:Int) -> String {
    return s.utf8.map {
        var code = Int($0)
        switch code {
            case 65...90:
                code = (code + n - 65) % 26 + 65
            case 97...122:
                code = (code + n - 97) % 26 + 97
            default:
                break
        }
        return String(UnicodeScalar(code)!)
    }.joined()
}
  • ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ณ„์‚ฐํ•ด์ฃผ์—ˆ๋‹ค.

 

๐Ÿ’ก ํ”ผ๋“œ๋ฐฑ
  • ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•œ ์ฝ”๋”ฉ ๋ฐฉ๋ฒ•๋„ ๊ณต๋ถ€ํ•ด๋ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค.
  • ๋‚ด๊ฐ€ ํ‘ผ ํ’€์ด๋Š” ๋‚ด๊ฐ€ ๋ด๋„ ์ข€ ๋ณต์žกํ•ด์„œใ…œ ๋” ๊ฐ„๊ฒฐํžˆ ํ’€์–ด๋ณด๋Š” ์—ฐ์Šต์„ ํ•ด์•ผ๊ฒ ๋‹ค.


 

๐Ÿ– [ ์ถ”๊ฐ€ ] 1์ฃผ์ผ ํ›„ ๋‹ค์‹œ ํ’€์–ด๋ณด๊ธฐ

func solution(_ s:String, _ n:Int) -> String {
    var result = ""
    let strLower = Array("abcdefghijklmnopqrstuvwxyz")
    let strUpper = Array("abcdefghijklmnopqrstuvwxyz".uppercased())
    
    for i in s {
        if i == " " { result.append(" ") }
        else {
            if strLower.contains(i) {
                result.append(String(strLower[(strLower.firstIndex(of: i)! + n) % 26])) }
            else {
                result.append(String(strUpper[(strUpper.firstIndex(of: i)! + n) % 26])) }
        }
    }
    return result
}
  • ์†Œ๋ฌธ์ž, ๋Œ€๋ฌธ์ž ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•ด์ฃผ์—ˆ๋‹ค.
  • ๊ณต๋ฐฑ์ด๋ผ๋ฉด ๊ณต๋ฐฑ์„ ์ถ”๊ฐ€ํ•ด์ฃผ๊ณ , ์†Œ๋ฌธ์ž ํ˜น์€ ๋Œ€๋ฌธ์ž์ผ ๊ฒฝ์šฐ ์ƒ์„ฑํ•œ ์†Œ๋ฌธ์ž ๋Œ€๋ฌธ์ž ๋ฐฐ์—ด์—์„œ ์œ„์น˜๋ฅผ ์ฐพ์•„์ฃผ์—ˆ๋‹ค.
  • ๋‚˜๋จธ์ง€ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตณ์ด ๋ฐฐ์—ด์„ ์ดˆ๊ณผํ•  ๋•Œ๋ฅผ ๋”ฐ์ง€์ง€ ์•Š๊ณ , ๋ฐ”๋กœ ์œ„์น˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๋‹ค.
  • ๋‚˜๋จธ์ง€ ์—ฐ์‚ฐ์„ ์ด์šฉํ•˜๋‹ˆ ์ฒซ ๋ฒˆ์งธ ํ’€์ด์— ๋น„ํ•ด ํ›จ์”ฌ ํšจ์œจ์ ์œผ๋กœ ์ฝ”๋“œ๊ฐ€ ์™„์„ฑ๋๊ณ ,
    ์ „์ฒด ์ฝ”๋“œ๋„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž˜ ์ž‘์„ฑ๋œ ๊ฒƒ ๊ฐ™๋‹ค.

 


 

๋ฌธ์ œ

https://programmers.co.kr/learn/courses/30/lessons/12926

๋Œ“๊ธ€