네오와 프로도가 숫자 놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
다음은 숫자 일부 자릿수를 영단어로 바꾸는 예시입니다.
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다.
s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요
처음에 생각한 풀이는 다음과 같다.
1. 매개변수 문자열 전체 길이만큼 for문 반복
2. 숫자일 경우 continue / 영어일 경우 별도의 변수에 push
3. push 마다 해당 변수가 engList 와 일치하는 문자가 있는지 검사
4. 일치할 경우 replace / 일치하지 않을 경우 continue
하지만 이와 같은 풀이의 경우 디버깅을 거치며 개선을 한다면 풀이가 가능은 하겠지만, for문의 2중첩 사용으로 시간복잡도가 높아 좋은 코드라고 보기 힘들었다.
해서 다른 풀이를 찾던 중 좋은 예시를 발견해 이를 설명하고자 한다.
function solution(s) {
var answer = s;
const engList = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'];
for(let i = 0; i<engList.length; i++)
{
let arr = answer.split(engList[i]);
answer = arr.join(i);
}
return answer;
}
주요 키워드로 split 과 join 메서드를 활용하였다. 간단히 말해서 문자열 s를 나누고, 다시 합치는 동작의 반복이다.
1. Split
매개변수로 들어온 값을 기준으로 문자열을 분리한다.
출력을 찍어보면 다음과 같이 나오는데,
engList[i] 를 기준으로 split 을 진행하니, 매칭되는 문자가 나타날 때마다 그 문자는 삭제, 그의 앞뒤로 문자열을 분리한다.
이 삭제 + 분리의 시점에서 2번 Join 을 사용할 여지가 발생한다.
2. Join
매개변수로 들어온 값을 더하며 문자열을 합한다.
단순 예시를 들어보자면
const arr = ['문자1', '문자2', '문자3'];
console.log(arr.join(''));
//출력 : '문자1문자2문자3'
console.log(arr.join('+'));
//출력 : '문자1+문자2+문자3'
다음과 같이 진행된다.
이 매개변수로 들어온 값을 앞뒤 문자열 사이에 넣어주면서 문자열을 합할 때, 1번 split 과정에서 기준이 됐던 engList 의 인덱스 값을 넣어주는 것이다.
이 과정을 출력을 찍으면 다음과 같이 나타난다.
1번의 출력 결과와 같이 비교했을 때를 보자
다음의 세 경우가 의도한 대로 흘러간 경우인데,
1. 'one' 이 매칭됐을 경우 'one' 을 기준으로 앞뒤 문자열을 분리 - [ '', '4seveneight' ]
2. 이 나눠진 문자열들을 join 을 통해 'one'의 인덱스값 1을 대입 - [ '14seveneight' ]
이 두 과정을 반복하는 것이다.
최종적으로 다른 예시까지 돌려본 출력 결과로는 다음과 같다.
[JS] 명예의 전당(1) - 프로그래머스 (0) | 2024.11.21 |
---|---|
[JS] 콜라 문제 - 프로그래머스 (0) | 2024.11.20 |
[JS] 가장 가까운 같은 글자 - 프로그래머스 (0) | 2024.11.18 |
[JS] 시저 암호 - 프로그래머스 (0) | 2024.11.13 |
[JS] 최소직사각형 - 프로그래머스 (0) | 2024.11.12 |