프로젝트 개발에만 집중하다 보니 알고리즘 문제 풀이에 소홀해진 것 같다. 알고리즘 문제는 단순히 코딩 실력을 넘어, 문제 해결 능력과 효율적인 사고 방식을 기르는데 중요한 역할을 한다고 생각한다. 이에 다시 한번 기본기를 다지고자, 프로그래머스의 기초 문제들을 풀어보았다. 문자열 문제를 풀면서 정리한 팁들을 작성해보고자 한다.
components와 split
Swift에서 문자열을 특정 구분자를 기준으로 나누는 데 자주 사용되는 두 가지 방법이 있다.
✅ components
let str = "Yeo,Seong,il"
let result = str.components(separatedBy: ",")
print(result) // ["Yeo", "Seong", "il"]
components(separatedBy:)는 NSString에서 제공하는 메소드로, Swift의 String 타입에도 사용할 수 있다. 이 메소드는 구분자를 기준으로 문자열을 나누어 String 배열을 반환한다.
let str = "Yeo,Seong;il"
let result = str.components(separatedBy: CharacterSet(charactersIn: ",;"))
print(result) // ["Yeo", "Seong", "il"]
✔️ 여러 구분자를 사용할 수 있다.
let str = "Yeo,,Seong,il"
let result = str.components(separatedBy: ",")
print(result) // ["Yeo", "", "Seong", "il"]
✔️ 빈 요소를 제거하지 않고 포함한다.
✅ split
let str = "Yeo,Seong,il"
let result = str.split(separator: ",")
print(result) // ["Yeo", "Seong", "il"]
split(separator:)는 Swift의 String 타입에 내장된 메소드로, 구분자를 기준으로 문자열을 나누어 Substring의 배열을 반환한다.
let str = "Yeo,,Seong,il"
let result = str.split(separator: ",")
print(result) // ["Yeo", "Seong", "il"]
✔️ 기본적으로 빈 요소를 제거하고 반환한다.
let str = "Yeo,,Seong,il"
let result = str.split(separator: ",", omittingEmptySubsequences: false)
print(result) // ["Yeo", "", "Seong", "il"]
✔️ 빈 요소를 포함해서 반환할 수 있다.
let str = "Yeo, Seong, il"
let result = str.split(separator: " ")
let result = str.split{ $0 == " " }
📚 str.split{$0 == " "}을 사용하면 간결하게 표시할 수 있다.
joined()
let arr = ["Yeo", "Seong", "il"]
let result = arr.joined()
print(result) // "YeoSeongil"
joined() 메소드는 배열의 요소들을 하나의 문자열로 결합하는 데 사용된다. 주로 배열의 요소가 문자열인 경우에 사용되며, 각 요소 사이에 특정한 구분자를 넣어 하나의 긴 문자열을 만들 수 있다.
let arr = ["Yeo", "Seong", "il"]
let result = arr.joined(separator: ", ")
print(result) // "Yeo, Seong, il"
✅ 구분자를 넣어 결합할 수 있다.
let emptyArray: [String] = []
let result = emptyArray.joined()
print(result) // ""
✅ 빈 배열에 대해 joined()를 호출하면 빈 문자열을 반환한다.
// 보통 단어를 문장으로 결합할 때 많이 사용한다.
let words = ["Swift", "is", "awesome"]
let sentence = words.joined(separator: " ")
print(sentence) // "Swift is awesome"
// URL 경로를 만들 때도 사용하긴 한다.
let pathComponents = ["user", "profile", "yeo"]
let path = pathComponents.joined(separator: "/")
print(path) // "user/profile/yeo"
String(repeating:count:)
let name = "Seongil"
let result = String(repeating: name, count: 4)
print(result) // "SeongilSeongilSeongilSeongil"
Swift에서 String(repeating:count:)는 특정 문자열을 반복하여 새로운 문자열을 생성할 때 사용되는 메소드이다. 이 메소드는 주어진 문자열을 지정된 횟수만큼 반복하여 하나의 긴 문자열을 만든다.
let a = "a"
let result = String(repeating: a, count: 5)
print(result) // "aaaaa"
✅ 단일 문자를 반복할 수도 있다.
let star = "*"
let result = String(repeating: star, count: 5)
print(result) // "*****"
✅ 특수 문자를 반복하여 패턴을 만들 수도 있다.
let name = "Seongil"
let result = String(repeating: name, count: 0)
print(result) // ""
✅ count 값이 0이면 빈 문자열을 반환한다.
❌ count 값으로 음수가 전달되면 런타임 오류 발생
접두사, 접미사
let str = "Hello, World!"
let prefixStr = str.prefix(5)
print(prefixStr) // "Hello"
prefix(_:) 메소드는 문자열의 앞에서부터 지정된 길이만큼의 부분 문자열을 반환한다.
let str = "Hello, World!"
let suffixStr = str.suffix(6)
print(suffixStr) // "World!"
suffix(_:) 메소드는 문자열의 뒤에서부터 지정된 길이만큼의 부분 문자열을 반환한다.
let str = "Hello, World!"
let droppedFirstStr = str.dropFirst(7)
print(droppedFirstStr) // "World!"
let droppedFirstChar = str.dropFirst()
print(droppedFirstChar) // "ello, World!"
dropFirst(_:) 메소드는 문자열의 앞에서부터 지정된 길이만큼의 문자를 제거한 부분 문자열을 반환한다. 인자를 지정하지 않으면 기본적으로 첫 번째 문자 하나를 제거한다.
let str = "Hello, World!"
let droppedLastStr = str.dropLast(7)
print(droppedLastStr) // "Hello, "
let droppedLastChar = str.dropLast()
print(droppedLastChar) // "Hello, World"
dropLast(_:) 메소드는 문자열의 뒤에서부터 지정된 길이만큼의 문자를 제거한 부분 문자열을 반환한다. 인자를 지정하지 않으면 기본적으로 마지막 문자 하나를 제거한다.