📌 문제
두 문자열 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은 알파벳 소문자로만 이루어져 있습니다.
- 1 ≤ index ≤ 20
📌 풀이
알아야 하는 것
- arr.map() : 배열 내의 모든 요소 각각에 대해 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환한다.
- str.split() : 괄호 안에 분리할 기준을 넣어준다. 아무 것도 넣지 않으면 그 문자열을 문자 단위로 쪼개어준다.
- arr.join() : 배열의 모든 요소를 연결해 하나의 문자열로 만든다.
구할 것
1) 문자열 skip에 있는 알파벳이 무엇인지 찾아낸다.
먼저 알파벳 26자를 모두 적은 배열 alphabet을 선언한다.
skip을 split으로 쪼개주고, map으로 그 문자 하나 하나를 가져와 배열 alphabet 에서 해당 문자를 삭제한다.
예를 들어 skip = "wbqd"라면 split으로 ["w", "b", "q", "d"]가 되었고, map으로 w... d까지 하나 하나를 v로 치환한 격이라고 이해할 수 있다. 그래서 indexOf로 이 문자가 배열 alphabet 에서 몇 번째 인덱스인지 찾은 후, 삭제했다. (1은 갯수를 의미한다.) 현재 배열 alphabet에는 skip에 해당된 알파벳들이 삭제되어 22자만 남아 있는 상태다.
2) 주어진 문자열 s에 index를 더한다. (이전에 풀었던 시저 암호와 유사하다.)
answer는 s를 위와 같이 똑같이 쪼개고, 각 문자 단위로 접근하는 변수를 말한다.
s의 각각 문자가 배열 alphabet에서 몇 번째 인덱스인지 찾고, 거기에 Index를 더해준다.
s = "aukks"일 때, a 먼저 5만큼 이동해보면 a (b) c e (d) f g h 라 h가 나오게 된다.
3) 논외를 고려한다.
u의 경우 5를 더하면 z의 인덱스보다 커져 범위가 어긋난다. 이런 경우 앞으로 다시 돌아와 a가 나와야 한다.
따라서 값을 더해주고, 배열 alphabet의 길이만큼 나눈 나머지를 인덱스 값으로 정한다.
예를 들어 u가 17일 때 (bqd가 삭제된 상태라 20이 아닌 17이다) 5를 더하면 22라 z가 나올 것 같지만, 뒤에 w도 삭제되어야 해서 실질적으로 a가 나와야 한다. 즉 22 % 22 = 0 이기에 alphabet[0] 으로 a가 나오게 되는 것이다.
이렇게 나오게 된 문자들은 모두 split 때처럼 쪼개져 있기 때문에 join('')으로 묶어준다.
function solution(s, skip, index) {
const alphabet = ['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']
skip.split('').map((v) => {
alphabet.splice(alphabet.indexOf(v), 1)
})
const answer = s.split('').map((v) => {
return alphabet[(alphabet.indexOf(v) + index) % alphabet.length]
}).join('')
return answer
}
'⚙️ 코딩테스트' 카테고리의 다른 글
[JavaScript] 프로그래머스 코딩테스트 레벨 1 : 대충 만든 자판 (0) | 2023.06.07 |
---|---|
[JavaScript] 프로그래머스 코딩테스트 레벨 2 : 기능 개발 (추가) (0) | 2023.06.07 |
[JavaScript] 프로그래머스 코딩테스트 레벨 1 : 과일 장수 (0) | 2023.06.06 |
[JavaScript] 프로그래머스 코딩테스트 레벨 1 : 문자열 나누기 (0) | 2023.06.05 |
[JavaScript] 프로그래머스 코딩테스트 레벨 1 : 2016년 (0) | 2023.06.01 |