상세 컨텐츠

본문 제목

[JS] 숫자 문자열과 영단어 - 프로그래머스

프로그래밍 및 언어/코딩 테스트 문제

by 남민우_ 2024. 11. 14. 11:06

본문

문제

네오와 프로도가 숫자 놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.

다음은 숫자 일부 자릿수를 영단어로 바꾸는 예시입니다.

  • 1478 => "one4seveneight"
  • 234567 => "23four5six7"
  • 10203 => "1zerotwozero3"

이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다.

s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요

제한사항

  • 1 <= s의 길이 <= 50
  • s가 "zero" 도는 "0" 으로 시작하는 경우는 주어지지 않습니다.
  • return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.

 

풀이

처음에 생각한 풀이는 다음과 같다.

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' ]

이 두 과정을 반복하는 것이다.

 

최종적으로 다른 예시까지 돌려본 출력 결과로는 다음과 같다.

관련글 더보기