https://school.programmers.co.kr/learn/courses/30/lessons/181949
let s1 = readLine()!
let upper = "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z".split(separator: " ")
let lower = "a b c d e f g h i j k l m n o p q r s t u v w x y z".split(separator: " ")
var result = ""
for j in 0..<s1.count {
for i in 0..<upper.count {
if Character(upper[i]) == Character(s1[j]) {
result.append(lower[i])
} else if Character(lower[i]) == Character(s1[j]) {
result.append(lower[i])
}
}
}
print(result)
문자열 인덱싱 문제
Swift에서는 String 타입의 인덱싱이 직접적으로 지원되지 않는다. s1[j]
와 같은 방식으로 문자열의 특정 위치에 접근할 수 없다.
문자열의 특정 위치에 접근하려면 String.Index를 사용해야 한다.
Substring을 Character로 변환 시도
Character(upper[i])
와 Character(lower[i])
에서 upper와 lower는 [Substring] 타입이므로, 각 요소는 Substring 타입이다.
Substring을 직접 Character로 변환하는 것은 불가능하므로 먼저 String으로 변환한 후 Character로 변환해야 한다.
비효율적인 알파벳 생성 방식
알파벳을 공백으로 구분된 문자열로 정의하고 split을 사용하는 것은 비효율적이다. 더 직관적인 방법으로는 문자 배열을 직접 정의하거나 ASCII 값을 활용하는 방법이 있다.
import Foundation
let s1 = readLine()!
let upper = Array("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
let lower = Array("abcdefghijklmnopqrstuvwxyz")
var result = ""
for c in s1 {
if let index = upper.firstIndex(of: c) { // 대문자인 경우
result.append(lower[index]) // 소문자로 반환
} else if let index = lower.firstIndex(of: c) { // 소문자인 경우
result.append(upper[index]) // 대문자로 반환
} else {
result.append(c)
}
}
print(result)
if let
구문을 사용한 이유는 firstIndex
의 반환값이 nil 인 경우도 있기 때문이다. (해당 문제에는 nil인 경우가 없지만)import Foundation
let s1 = readLine()!
var result = ""
for c in s1 {
if c.isUppercase {
result.append(c.lowercased()) // 대문자면 소문자로 변경
} else {
result.append(c.uppercased()) // 소문자면 대문자로 변경
}
}
print(result)
isUppercase
내장 속성을 사용해 대소문자 판별lowercased()
, uppercased()
내장 메서드 사용해 대소문자 변경👉 스위프트다운 코드 완성
매번 헷갈리던 Substring에 대한 포스트는 따로 적어두었다.
https://velog.io/@juhee-dev/Swift-문법-Substring-이해하기