문제 설명 두 문자열 s와 skip, 그리고 자연수 index가 주어질 때, 다음 규칙에 따라 문자열을 만들려 합니다. 암호의 규칙은 다음과 같습니다.문자열 s의 각 알파벳을 index만큼 뒤의 알파벳으로 바꿔줍니다.index만큼의 뒤의 알파벳이 z를 넘어갈 경우 다시 a로 돌아갑니다.skip에 있는 알파벳은 제외하고 건너뜁니다. 예를 들어 s = "aukks", skip = "wbqd", index = 5일 때, a에서 5만큼 뒤에 있는 알파벳은 f지만 [b, c, d, e, f]에서 'b'와 'd'는 skip에 포함되므로 세지 않습니다. 따라서 'b', 'd'를 제외하고 'a'에서 5만큼 뒤에 있는 알파벳은 [c, e, f, g, h] 순서에 의해 'h'가 됩니다. 나머지 "ukks" 또한 위 규칙대로 바꾸면 "appy"가 되며 결과는 "happy"가 됩니다. 두 문자열 s와 skip, 그리고 자연수 index가 매개변수로 주어질 때 위 규칙대로 s를 변환한 결과를 return하도록 solution 함수를 완성해주세요.
제한사항 5 ≤ s의 길이 ≤ 501 ≤ skip의 길이 ≤ 10s와 skip은 알파벳 소문자로만 이루어져 있습니다. skip에 포함되는 알파벳은 s에 포함되지 않습니다.1 ≤ index ≤ 20
let alphabets: [Character] = Array("abcdefghijklmnopqrstuvwxyz") - Array(skip)
// Error: Binary operator '-' cannot be applied to two '[Character]' operands
실패 2: array는 차집합이 안 되지만 set은 차집합이 된다는 것을 알고 다시 시도했다. 역시나 '-' 기호로는 차집합이 안 된다.
let alphabets2: [Character] = Set("abcdefghijklmnopqrstuvwxyz") - Set(skip)
// Error: Binary operator '-' cannot be applied to two 'Set<String.Element>' (aka 'Set<Character>') operands
성공 : set에 .subtracting(_:)이라는 메소드를 사용하면 차집합이 가능하다는 것을 알게 되었다!
let alphabets: [Character] = Set("abcdefghijklmnopqrstuvwxyz").subtracting(Set(skip)).sorted()
따라서 전체 코드는 다음과 같이 작성했다.
import Foundation
func solution(_ s:String, _ skip:String, _ index:Int) -> String {
let alphabets: [Character] = Set("abcdefghijklmnopqrstuvwxyz").subtracting(Set(skip)).sorted()
let len = alphabets.count
var answer: String = ""
for char in s {
if let i = alphabets.firstIndex(of: char) {
answer += String(alphabets[(i + index) % len])
}
}
return answer
}
solution("aukks","wbqd", 5) // "happy"
🥕 알게 된 것 - set 초기화 방법
변수를 새로 선언할 때 다음처럼 해도 되지만,
let set1: Set = [1,2,3]
let set2: Set<Int> = [1,2,3]
let set3: Set<String> = ["a", "b", "c"]
Set(_:)으로 이미 있는 string 또는 array를 집합으로 바꿀 수도 있다.
let arr1 = [1,2,3]
let arr2 = ["a", "b", "c"]
let str = "ABC"
Set(arr1) // Set of 3 Int elements: [3, 1, 2]
Set(arr2) // Set of 3 String elements: ["b", "a", "c"]
Set(str) // Set of 3 Character elements: ["B", "A", "C"]
🥕 알게 된 것 - 집합 연산 (합집합, 차집합 등)은 set에서만 가능하다.
집합 연산 (합집합, 차집합 등)은 set에서만 가능하다.
- 합집합 : 집합1.union(집합2)
- 교집합 : 집합1.intersection(집합2)
- 차집합 : 집합1.subtracting(집합2)
- 대칭 차집합 : 집합1.symmetricDifference(집합2)
let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]
// 합집합
oddDigits.union(evenDigits).sorted()
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
// 교집합
oddDigits.intersection(evenDigits).sorted()
// []
// 차집합
oddDigits.subtracting(singleDigitPrimeNumbers).sorted()
// [1, 9]
// 대칭 차집합
oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted()
// [1, 2, 9]
🥕 알게 된 것 - 집합을 정렬(sorted())하면 배열이 된다.
let set: Set = [1,2,3,4]
print(type(of: set)) // Set<Int>
print(type(of: set.sorted())) // Array<Int>