
문제
시저 암호
풀이
func solution(_ s:String, _ n:Int) -> String {
    var answer = ""
    let input = Array(s)
    let uppercases = Array("abcdefghijklmnopqrstuvwxyz".uppercased())
    let lowercases = Array("abcdefghijklmnopqrstuvwxyz")
    
    for x in input {
        
        if x == " " { answer += " " }
        
        else if x.isUppercase == true {
            var idx = uppercases.firstIndex(of: x)! + n
            
            if idx > 25 { idx -= 26 }
            
            answer.append(uppercases[idx])
        }
        
        else {
            var idx = lowercases.firstIndex(of: x)! + n
            if idx > 25 { idx -= 26 }
            answer.append(lowercases[idx])
        }
    }
    return answer
}
🤔 FEEDBACK
- 비트 연산자로 풀려고 했다가 이론 접하고 이게 맞나? 싶었다.
- 그 다음 아스키코드로 풀려다가 로직은 맞는데 계속 오류가 났다.
- 그래서 그냥 배열로 만들어 풀었다. 그것도 힌트보고 ... 🥲
다른 풀이
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()
}
- 내가 하려던 방식이 이건데 .. switch case를 왜 생각못했지?😮
- code >= 122와- code >= 90의 범위가 같아서 애먹었는데 이런방법이..
func solution(_ s:String, _ n:Int) -> String {
    let alphabets = "abcdefghijklmnopqrstuvwxyz".map { $0 }
    return String(s.map {
        guard let index = alphabets.firstIndex(of: Character($0.lowercased())) else { return $0 }
        let letter = alphabets[(index + n) % alphabets.count]
        return $0.isUppercase ? Character(letter.uppercased()) : letter
    })
}
- 와 이건 또 뭐야..!
- print(alphabets) 해보니까 Array()하고 똑같은 결과나왔다.
- 가독성은 떨어지지만 시간복잡도나 메모리는 비슷한 것 같다.