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

Lenny·2022년 1월 10일
0
post-thumbnail

숫자 문자열과 영단어

프로그래머스 LEVEL 1 에 있는 문제이다.

문제

나의 풀이

function solution(s) {
    // s가 의미하는 원래 숫자를 return 하도록 작성
    // 영단어를 숫자로 변경
    var words = s
    .replace(/zero/gm, 0)
    .replace(/one/gm, 1)
    .replace(/two/gm, 2)
    .replace(/three/gm, 3)
    .replace(/four/gm, 4)
    .replace(/five/gm, 5)
    .replace(/six/gm, 6)
    .replace(/seven/gm, 7)
    .replace(/eight/gm, 8)
    .replace(/nine/gm, 9);
    
    var answer = parseInt(words);

    return answer;
}

처음엔 배열을 만들어서 풀어볼까 접근했다가, 바로 전에 푼 "신규 아이디 추천" 에서 정규식을 사용하여 풀었던 문제가 생각나서 정규식을 이용해서 풀어봤다.
zero 부터 nine 까지 문자를 각 문자에 맞는 숫자로 바꿔주었다.
정규식을 활용하여 쉽게 풀 수 있는 문제였다!

다른사람의 풀이

function solution(s) {
    let numbers = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"];
    var answer = s;

    for(let i=0; i< numbers.length; i++) {
        let arr = answer.split(numbers[i]);
        answer = arr.join(i);
    }

    return Number(answer);
}

정규식을 사용하지 않고 배열을 사용하여 푸신 분의 코드이다.
먼저 zero 부터 nine 까지의 문자열을 담고있는 배열을 만들고, answer에는 테스트 코드들을 받아온다.

for문으로 들어가서 split을 이용하여, 각 문자열에 해당하는 값을 기준으로 잘라준다.
예를들어 one4seveneight 가 answer에 들어왔다고 하면, for문 초기식이 i = 1 일 때,
"one"을 기준으로 배열을 잘라준다. 이 때 "one"을 기준으로 하기때문에 "one"이 없어지고,
arr은 ["", "4seveneight"] 이상태가 될것이다. 그 다음 join 메서드를 이용하여 배열을 문자열로 합쳐준다.

join 메서드에 파라미터를 넣게되면, 구분되어 있는 배열 사이에 파라미터로 넣어준 값이 들어가게된다.

즉 현재 ["", "4seveneight"] 이 상태에서, join(1)을 해주게되면
"14seveneight" << 이렇게 치환된다.

["", "4seveneight"] 이 배열의 ,(콤마) < 이 부분을 1로 대체하여 하나의 문자열로 만든다는 뜻이다.

이걸 반복문을 통해서 하게되면, 각 문자에 해당하는 값들은 공백으로 바뀔것이고 ("") 그 때마다 조인으로 해당 문자에 해당하는 인덱스값으로 join을 해줘서 one4seveneight 은 1478으로 변환되는것이다!

여기까지 다른 사람의 코드까지 해석해보았다. 개인적으로 이 방법이 마음에 든다!
뭔가 근본있는 방법같은 느낌..? 코드도 깔끔하고 아이디어가 정말 좋은것같다.

profile
🧑‍💻

0개의 댓글