문제 설명
두 문자열 s와 skip, 그리고 자연수 index가 주어질 때,
다음 규칙에 따라 문자열을 만들려 합니다.
암호의 규칙은 다음과 같습니다.
1)
문자열 s의 각 알파벳을 index만큼 뒤의 알파벳으로 바꿔줍니다.
2)
index만큼의 뒤의 알파벳이 z를 넘어갈 경우 다시 a로 돌아갑니다.
3)
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의 길이 ≤ 50
1 ≤ skip의 길이 ≤ 10
s와 skip은 알파벳 소문자로만 이루어져 있습니다.
skip에 포함되는 알파벳은 s에 포함되지 않습니다.
1 ≤ index ≤ 20
입출력 예
s | skip | index | result |
"aukks" | "wbqd" | 5 | "happy" |
입출력 예 설명
입출력 예 #1
본문 내용과 일치합니다.
나의 풀이
func solution(_ s:String, _ skip:String, _ index:Int) -> String {
var answer = ""
var skipToAsciis = stringToAsciis(skip)
for i in stringToAsciis(s) {
var ascii = i
var count = 0
while count < index {
ascii += (ascii < 122) ? 1 : -25
count += (skipToAsciis.contains(ascii)) ? 0 : 1
}
answer += asciiToString(ascii)
}
return answer
}
func stringToAsciis(_ s: String) -> [Int] {
return s.map { Int(UnicodeScalar(String($0))!.value) }
}
func asciiToString(_ i: Int) -> String {
return String(UnicodeScalar(i)!)
}
다른 사람의 풀이
enumerated를 활용하여 풀어낸 것을 보았습니다 !
enumerated에 대해 잘 모르기도 하고,
찾아보니 문제를 풀 때 뿐만 아니라
개발을 할 때도 많은 도움이 될 거 같아서
정리 해보려고 합니다 ~
(다른 사람의 풀이 <- 모르는 문법을 정리하는 목차로 탈바꿈한 느낌이 듭니다.)
(n, x) 쌍의 sequence를 반환합니다.
n -> 0부터 시작하는 인덱스
x -> sequence의 요소
반환된 값에 .element와 .offset으로
각각의 요소와 인덱스에 접근할 수 있습니다 !
sequence란?
sequence는 한 번에 하나씩 가져올 수 있는 값들의 목록입니다.
대표적으로 많이 사용하는
Array, Set, Dictionary도 이에 해당합니다.
위의 세 개는 Collection 프로토콜을 채택하고 있고,
Collection 프로토콜은 Sequence 프로토콜을 채택하고 있습니다.
그렇기 때문에 우리가 위의 것들을
반복문이나 고차함수 등에 활용할 수 있는 것이죠.
'Data structure & Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스 | Lv.1] 햄버거 만들기 (1) | 2024.04.30 |
---|---|
[프로그래머스 | Lv.1] 대충 만든 자판 (7) | 2024.04.17 |
[프로그래머스 | Lv.1] 문자열 나누기 (3) | 2024.04.15 |
[프로그래머스 | Lv.1] 숫자 짝꿍 (6) | 2024.04.12 |
[프로그래머스 | Lv.1] 체육복 (3) | 2024.04.11 |