2024. 2. 15. 11:59ㆍ공부/코테준비
목차
1. 문제
코딩테스트 연습 - 둘만의 암호 | 프로그래머스 스쿨 (programmers.co.kr)
문제 설명
두 문자열 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
입출력 예sskipindexresult
"aukks" | "wbqd" | 5 | "happy" |
입출력 예 설명
입출력 예 #1
본문 내용과 일치합니다.
2. 시도
function solution(s, skip, index) {
let answer = ''
let alphabet =
'abcdefghijklmnopqrstuvwxyz'
for (let skipped of skip){
alphabet = alphabet.replace(skipped,'')
}
alphabet = alphabet.split('')
for(let _s of s){
answer += alphabet[(alphabet.indexOf(_s)+index)%alphabet.length]
}
return answer
}
테스트 1 | |
입력값 〉 | "aukks", "wbqd", 5 |
기댓값 〉 | "happy" |
실행 결과 〉 | 테스트를 통과하였습니다. |
for문을 두번밖에 안돌렸으니까 시간 복잡도도 낮은 아주 좋은 답변 아닐까?
3. 결과
테스트 1 〉 | 통과 (0.31ms, 33.4MB) |
테스트 2 〉 | 통과 (0.09ms, 33.4MB) |
테스트 3 〉 | 통과 (0.25ms, 33.4MB) |
테스트 4 〉 | 통과 (0.08ms, 33.5MB) |
테스트 5 〉 | 통과 (0.27ms, 33.5MB) |
테스트 6 〉 | 통과 (0.20ms, 33.4MB) |
테스트 7 〉 | 통과 (0.27ms, 33.5MB) |
테스트 8 〉 | 통과 (0.12ms, 33.4MB) |
테스트 9 〉 | 통과 (0.07ms, 33.5MB) |
테스트 10 〉 | 통과 (0.08ms, 33.4MB) |
테스트 11 〉 | 통과 (0.32ms, 33.5MB) |
테스트 12 〉 | 통과 (0.18ms, 33.5MB) |
테스트 13 〉 | 통과 (0.20ms, 33.4MB) |
테스트 14 〉 | 통과 (0.07ms, 33.5MB) |
테스트 15 〉 | 통과 (0.11ms, 33.4MB) |
테스트 16 〉 | 통과 (0.11ms, 33.5MB) |
테스트 17 〉 | 통과 (0.12ms, 33.4MB) |
테스트 18 〉 | 통과 (0.24ms, 33.5MB) |
테스트 19 〉 | 통과 (0.28ms, 33.5MB) |
잘 먹었습니다!
4. 배운점
검색을 통해 찾아낸 코드
function solution(s, skip, index) {
let answer = ''
const alphabet =
'abcdefghijklmnopqrstuvwxyz'.split('').filter((n)=>!skip.includes(n))
answer = s.split('').map((a) => alphabet[(alphabet.indexOf(a)+index) % alphabet.length]).join('');
return answer
}
(for문 대신 filter와 map을 쓴다면 코드가 더 간결해 보인다!)
문자 처리:
나 : skip에 지정된 문자를 기준으로 알파벳 문자열의 문자를 대체
검색 : 'skip'에 지정된 문자를 알파벳 배열에서 필터링
문자 매핑:
나 : 루프를 사용하여 변형된 알파벳에서 각 문자의 색인을 찾아 새로운 색인을 계산
검색 : map 기능을 사용하여 s의 각 문자를 제공된 수식을 사용하여 수정된 알파벳의 해당 문자에 직접 매핑
요약하자면, 검색으로 찾은 코드는 나의 코드에 비해 더 간결하고 명확하여 가독성이 높다.
구현에만 만족하지 말고, 가독성과 성능도 챙길 수 있도록 더욱 노력해야 할 것 같습니다.
'공부 > 코테준비' 카테고리의 다른 글
[Node.js_4기] 코드카타 : 할인행사 (24/03/08) (0) | 2024.03.11 |
---|---|
[Node.js_4기] 코드카타 : n개의 최소 공배수 (24/03/07) (0) | 2024.03.07 |
[Node.js_4기] 코드카타 : 피보나치 수열 (24/02/26) (0) | 2024.02.26 |
[Node.js_4기] 코드카타 : 이진 변환 반복하기 (24/02/22) (0) | 2024.02.22 |
[Node.js_4기] 알고리즘 : JadenCase 문자열 만들기 (24/02/21) (0) | 2024.02.21 |