가치투자자

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

Problem Solving/Programmers

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

미주민 2023. 6. 22. 01:58
728x90
반응형

Programmers : 숫자 문자열과 영단어

 

🔗 문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/81301

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


💬 문제

이 문제는  문자열 과  배열 에 대한 이해가 있다면, 충분히 풀 수 있는 문제였다.

 join() 메서드 의 작동원리에 대해 명확히 알고 있을 필요가 있는 문제였다.

 

  1. 일부 자릿수가 영단어로 되어 있는 숫자 문자열 s가 주어진다.

  2. 영단어로 된 일부 자릿수를 원래 숫자로 바꾸어 "정수"로 출력해주면 된다.

 

728x90

 


💡 입출력 예시

1번째 예시를 보면, one과 seven, eight가 영단어로 되어 있으므로 이를 정수로 바꿔 1478이 되어야 한다.

4번째 예시를 보면, 영단어가 없고 전부 숫자로 되어 있으므로 이를 정수화하여 123이 되어야 한다.

 

 

반응형

 


💻 풀이

이 문제는 총 2가지 방식으로 풀 수 있다.

🔑 풀이1 : 문자열 및 배열

  • 인덱스번호(index)와 문자열이 대응되도록 배열 numbers를 만들어준다.

    - 주어진 문자열 s의 일부 영단어가 하나씩 숫자로 바뀌어야 하므로, 이를 answer에 할당해준다

  • 0부터 9까지 돌면서 문자열 answer를 각 영단어를 기준으로 잘라주고, 숫자를 기준으로 합쳐준다.

    - 기준이 된 영단어는 split() 메서드로 제거된다

    - join() 메서드를 통해 숫자를 기준으로 잘려진 문자열들을 합쳐준다

    - 이때 문자열이 잘려지지 않아 배열 tmp의 요소가 하나뿐이라면 기준이 되는 숫자(구분자)는 배열 요소에 합쳐지지 않는다

  • 전부 숫자로 바뀐 문자열 answer를 정수로 반환해준다.
function solution(s) {
    const numbers = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"];
    let answer = s;
    
    for (let i=0; i < 10; i++) {
        let tmp = answer.split(numbers[i]);
        answer = tmp.join(i);
    }
    return parseInt(answer);
}

👣 예제를 참고한 풀이

1번째 예시 one4seveneight를 통해 풀어보면 다음과 같다.

 

맨처음 zero를 기준으로 잘라줘야 하지만 문자열에 zero가 없기에 tmp는 ['one4seveneight']가 된다.

이때의 핵심은  join() 이다. join()은 배열의 모든 요소를 문자열로 변환한 후, 구분자(seperator)를 기준으로 요소들을 하나의 문자열로 연결해주는 메서드다. 그러나 배열의 요소가 하나뿐일 때는 구분할 요소가 없으므로 구분자는 무시되고, 요소 그대로 반환된다. 따라서 0one4seveneight가 아니라 one4seveneight가 반환된다.

 

그 다음 one이 있기에 one을 기준으로 잘라주면 tmp는 ['', '4seveneight']이 되고, 요소가 2개 이상이므로 구분자 1을 기준으로 합쳐 answer에는 14seveneight가 할당된다. 그 이후 seven과 eight도 동일한 방식으로 바뀌어 최종적으로 1478이 반환된다.

 

 

실행 결과와 채점 결과는 다음과 같다.

 

 

 


🔑 풀이2 : 정규표현식

  • 정규표현식을 사용하여 s의 각 영단어를 정수로 교체해준다.

  • 전부 숫자로 바뀐 문자열 s를 정수로 반환해준다.
function solution(s) {
    s = s.replace(/zero/g, 0)
         .replace(/one/g, 1)
         .replace(/two/g, 2)
         .replace(/three/g, 3)
         .replace(/four/g, 4)
         .replace(/five/g, 5)
         .replace(/six/g, 6)
         .replace(/seven/g, 7)
         .replace(/eight/g, 8)
         .replace(/nine/g, 9);
    return parseInt(s);
}

 

실행 결과와 채점 결과는 다음과 같다.

 

 

 


</> 끊임없이 성장하기 위해 공부한 내용을 글로 작성하고 있습니다. 틀린 부분이나 추가해야 할 부분이 있다면 언제든 댓글로 남겨주세요❗️

 

728x90
반응형

'Problem Solving > Programmers' 카테고리의 다른 글

[프로그래머스] 튜플  (0) 2023.06.29
[프로그래머스] 비밀지도  (0) 2023.06.22
[프로그래머스] 캐시  (0) 2023.06.18
[프로그래머스] 의상  (1) 2023.05.26
[프로그래머스] 완주하지 못한 선수  (0) 2023.05.25