문제 출처 : https://school.programmers.co.kr/learn/courses/30/lessons/155652
난이도 : Level.1
언어 : Kotlin
문제 설명 :
두 문자열 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의 길이 ≤ 50
- 1 ≤ skip의 길이 ≤ 10
- s와 skip은 알파벳 소문자로만 이루어져 있습니다.
- skip에 포함되는 알파벳은 s에 포함되지 않습니다.
- 1 ≤ index ≤ 20
입출력 예 :
s | skip | index | result |
"aukks" | "wbpd" | 5 | "happy" |
풀이 :
class Solution {
fun solution(s: String, skip: String, index: Int): String {
var answer: String = ""
val chars = ('a' .. 'z').map { it }.filter { it !in skip.map { it.toChar() } }
s.forEach {
val newIndex = (chars.indexOf(it) + index) % chars.size
answer += chars.elementAt(newIndex)
}
return answer
}
}
s를 반복문 돌려서 char를 하나씩 뽑고, 뽑힌 char를 a-z 기준 index번째 뒤 알파벳을 answer에 추가시킨다.
이때, a-z 배열은 skip에 들어간 char를 제외해야한다.
a-z를 map을 통해 간단히 리스트를 만들고, 필터를 통해 skip의 char를 제외시킨다.
이후 forEach 반복문을 통해 chars에서 가져올 element의 newIndex를 만든다.
newIndex는 chars 기준 현재 s의 char를 찾기 위해 indexOf를 먼저 사용한 뒤, 주어진 index를 더하면 위치가 나온다.
하지만, 여기서 주의 할 점은 다음과 같다.
- 알파벳 a-z의 크기는 26
- skip 될 수 있는 char의 총 크기는 10
- index의 최대 크기는 20
이므로, skip이 10일때, skip된 a-z의 크기는 16이 된다.
근데 이때 index의 값이 16보다 크다면 indexOutOfBound 에러가 발생할 것이다. 이를 방지하기 위해 skip된 chars의 크기로 나머지 연산을 하면 된다.
예를 들어, 다음과 같이 주어질 때
s | skip | index |
"g" | "hijklmnopqrs" | 20 |
g의 위치는 abcdefg 로 6번째에 위치하게 된다. 여기서 주어진 index가 20이므로 20번째 뒤 알파벳이 필요하기에 6 + 20를 시행하면 26이 된다.
skip된 chars의 크기가 14이므로, 26 % 14를 하게 되면 [몫 1, 나머지 12]이 나오므로 index = 12.
가져와지는 char는 y가 된다. (chars = abcdefgtuvwxyz)
문제 푸는데 걸린 시간 총 30분
'프로그래머스 > Level 1' 카테고리의 다른 글
[Lv. 1] 신규 아이디 추천 (0) | 2023.06.22 |
---|---|
[Lv. 1] 실패율 (0) | 2023.06.22 |
[Lv. 1] 개인정보 수집 유효기간 (0) | 2023.06.22 |
[Lv. 1] 핸드폰 번호 가리기 (0) | 2023.06.21 |
[Lv. 1] 나누어 떨어지는 숫자 배열 (0) | 2023.06.21 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!