
일단 이 문제를 보자마자 아스키코드를 사용해야겠다! 라는 생각까지는 했다. 그러나 문제는 내가 swift에서 문자를 아스키코드로 변환하는 방법을 모른다는 것이다.🫥 그래서 검색을 해보았다. 이 문제에서는 문자열을 아스키코드로 변환하면 아주 편한데 문자열을 아스키코드로 변환하는 방법은 없고 문자(char)를 아스키코드로 변환하는 방법을 찾을 수 있었다.
let char: Character = "A"
let scalarValue = Unicode.Scalar(String(char))!
let asciiCode = scalarValue.value
print(asciiCode)
위의 코드는 문자를 아스키코드로 변환하는 방법인데 먼저 char를 scalarValue로 바꾼후 scalarValue를 asciiCode로 변환하는 원리이다. 반대로 아스키코드를 문자로 복원하는 방법은 다음과 같다.
let asciiCode: UInt8 = 65
let scalarValue = Unicode.Scalar(asciiCode)
let character = scalarValue.description
print(character)
이외에도 이 문제에서 생각해야하는 것은 단순히 ascii코드를 옆으로 밀어주는 것 뿐만 아니라 밀어준 아스키코드값이 문자 범위를 벗어나면 다시 문자열로 복원해주어야 하며, 공백 문자는 밀어주지 말아야 한다.
그렇게 제출한 답은 다음과 같다.
func solution(_ s:String, _ n:Int) -> String {
var charToAscii: [UInt8] = []
var asciiToChar = ""
for char in s {
if 65 <= char.asciiValue! && char.asciiValue! <= 90 {
if char.asciiValue! + UInt8(n) > 90 {
charToAscii.append(char.asciiValue! + UInt8(n) - 26)
} else {
charToAscii.append(char.asciiValue! + UInt8(n))
}
} else if char == " " {
charToAscii.append(char.asciiValue!)
} else{
if char.asciiValue! + UInt8(n) > 122 {
charToAscii.append(char.asciiValue! + UInt8(n) - 26)
} else {
charToAscii.append(char.asciiValue! + UInt8(n))
}
}
}
//print(charToAscii)
for asc in charToAscii {
asciiToChar.append(String(UnicodeScalar(asc)))
}
//print(asciiToChar)
return asciiToChar
}