문제
시저 암호
풀이
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()하고 똑같은 결과나왔다.
- 가독성은 떨어지지만 시간복잡도나 메모리는 비슷한 것 같다.