JavaScript/알고리즘

프로그래머스 숫자 문자열과 영단어 JS ( replace() ) - [2021 카카오 채용연계형 인턴십]

hihiha2 2023. 5. 29. 23:00
반응형

문제 설명

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

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

  • 1478 → "one4seveneight"
  • 234567 → "23four5six7"
  • 10203 → "1zerotwozero3"

이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.

 

 

 

✅ 내 코드

function solution(s) {
  s = s.replace(/zero/gi, 0);
  s = s.replace(/one/gi, 1);
  s = s.replace(/two/gi, 2);
  s = s.replace(/three/gi, 3);
  s = s.replace(/four/gi, 4);
  s = s.replace(/five/gi, 5);
  s = s.replace(/six/gi, 6);
  s = s.replace(/seven/gi, 7)
  s = s.replace(/eight/gi, 8);
  s = s.replace(/nine/gi, 9);

  return Number(s);
}

 

 

🙋‍♀️ 내 생각

문자열의 일부 자릿수를 숫자로 바꾸는 것이 조건이었기때문에 replace()을 사용해야겠다고 생각했다.

 

replace()는 원본을 바꾸는 것이 아니라, 교체된 새로운 문자열을 반환하기 때문에 

원본값 s에 새로운 값을 할당해줘야 s를 return해줬을때 내가 변경해준 값이 나온다.

 

그래서 s = s.replace(/zero/g, 0)과 같이 바뀔값, 바꿀값을 인자로 넣어주고 그것을 s에 할당해주었다.

나는 일일이 저렇게 할당을 해주었는데 아래의 코드와 같이 .replace로 이어서 쓸수있다는 것을 알게 되었다.

 

function solution(s) {
  s = s.replace(/zero/gi, 0)
  .replace(/one/gi, 1)
  .replace(/two/gi, 2)
  .replace(/three/gi, 3)
  .replace(/four/gi, 4)
  .replace(/five/gi, 5)
  .replace(/six/gi, 6)
  .replace(/seven/gi, 7)
  .replace(/eight/gi, 8)
  .replace(/nine/gi, 9)

  return Number(s);
}

 

replace를 이용해서 문자열을 교체한뒤에

Number를 통해서 타입을 숫자로 변환해주었다.

 

replace의 결과값은 문자열로 나오기 때문이다!

 

 

💻 내가 사용한 메서드

replace():  어떤 패턴에 일치하는 부분 또는 모든 부분이 교체된 새로운 문자열을 반환

String.replace()

 

replace의 인자로 2개가 들어가는데 첫번째 인자로는 대체되어 사라질값을, 두번째 인자로는 대체하여 새롭게 들어올 값을 넣어주면 된다.

var newStr = str.replace(regexp|substr, newSubstr|function)

 

.replace(/A/i, B): 대소문자 상관없이 replace

.replace(/A/g,B): 전역적으로 replace

.replace(/A/gi,B): 전역적 + 대소문자 상관없이 replace 

 

💻 학습한것

이번 문제를 풀면서 replace에 대해서 새롭게 알게 된 점이 2가지있다.

1.❌ 처음에는 값을 s = s.replace()와 같이 값을 대입하지 않고, 바로 replace를 해준다음에 s를 리턴하였다.

 

function solution(s) {
s.replace("zero",0)
s.replace("one",1)
s.replace("two",2)
s.replace("three",3)
s.replace("four",4)
s.replace("five",5)
s.replace("six",6)
s.replace("seven",7)
s.replace("eight",8)
 s.replace("nine",9)
    
    return Number(s)
}

이렇게하면 값이 변화하지 않고 원본의 s가 그대로 나온다.

 

✅ 그래서 replace를 사용하고 리턴을 해줄때는 바로 리턴을 해주거나 아니면 할당을 해준뒤에 해야 값이 업데이트되어서 나온다.

 

2. ❌ 두번째로는 /g를 해주지 않았다.

값이 한번만 나오는 줄 알고 안했었는데 문제를 다시 읽어보니 값이 두번씩 반복될수도 있었다.

/g를 해주지 않으면 첫번째의 값만 replace가 적용되기 때문에 정확한 답이 나오지 않는다.

 

문제를 처음 풀었을때는 /g만해줘도 통과가 됐었는데 갑자기 안되어서 /gi로 바꿨더니 통과가 됐다.

/gi는 전역적 + 대소문자 구분없이 치환해달라는 의미이다.

seven, SEVEN 모두 상관없이 7로 변환이 된다.

 

💻  다른사람 코드중에 배울 것

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);
}

생각지도 못한 코드인데 좋은것같아서 공부해보았다.

 

일단 문자열들을 number라는 변수를 통해서 배열에 담는다.

그러고나서 for문을 돌면서 s를 split()을 통해서 잘라주는데 잘라줄때 seperator로 number의 인덱스를 이용한다.

zero에는 0이 one에는 1이 .. 이런식으로 일일이 지정하지 않아도 인덱스로 접근하면 값을 쉽게 이용할 수가 있다.

 

그래서 s를 문자열이 있는 부분을 기준으로 자르면 그 공간이 비게 된다.

이것을 또다시 join을 이용해서 이어주는데 이때는 그 빈 부분에 i가 들어가기 때문에 문자열 대신에 숫자가 들어온다.

 

 

기발하지만 내가 이용한 replace()이용한 방법보다는 복잡해서 이해하는데 시간이 필요했다.

 

완전히 익숙해질때까지 다시 봐도 좋을 코드인것같다.

반응형