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

코테연습|2022. 2. 19. 16:01

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

 

숫자의 일부 자릿수가 영단어로 표기되어 있고, 이를 숫자로 다시 바꾸는 문제.

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

 

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

문자열이 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해야 함.

 

제한사항

  • 1 ≤ s의 길이 ≤ 50
  • s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않음
  • return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어짐

 

 

영문으로 나타낸 숫자를 가진 배열 strings 와 숫자 배열 numbers를 만들고,

for문 내에서 0번째부터 10번째 위치까지 strings배열 내에 있는 텍스트를 포함하는지 확인한다.

확인 결과가 true면, 해당 문자열을 같은 위치의 numbers로 대체(replace)해 준다.

리턴값은 숫자여야 하기 때문에, 마지막에 parseInt()도 해 준다.

function solution(s) {
  var strings = [
    "zero",
    "one",
    "two",
    "three",
    "four",
    "five",
    "six",
    "seven",
    "eight",
    "nine",
  ];
  var numbers = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];

  for (i = 0; i < 10; i++) {
    if (s.includes(strings[i])) {
        s = s.replace(strings[i], numbers[i]);
      }
    }

  s = parseInt(s);
  return s;
}

solution("2three4fivefivefivefivesixseven");

이렇게 했을 때 문제점이...

"같은 문자열이 여러 번 나오는 경우"는 맨 앞에 나오는 문자열만 변환해 준다는 것이다.

예를 들어, "2three4fivefivefivefivesixseven"을 받았을 때 올바른 결과값은 234555567 이지만,

위 코드의 결과로는 2345 가 출력된다.

 

원래는 replaceAll() 함수를 사용하고 싶었으나, 버전 문제인지 그런 함수는 없다는 에러메시지가 계속 떴고,

그래서 우선은 "해당 문자열이 몇 번 나오는지" 구한 후, 그 횟수만큼 replace를 반복하도록 코드를 수정했다.

function solution(s) {
  var strings = [
    "zero",
    "one",
    "two",
    "three",
    "four",
    "five",
    "six",
    "seven",
    "eight",
    "nine",
  ];
  var numbers = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];

  for (i = 0; i < 10; i++) {
    if (s.includes(strings[i])) {
        // string[i]이 몇 번 들어가는지 세어서 변수 c 에 저장해 준다.
      var c = s.split(strings[i]).length - 1;
      for (j = 0; j < c; j++) {
          //그리고 그 횟수만큼 반복해서 해당 string을 number로 바꿔줄 것임.
        s = s.replace(strings[i], numbers[i]);
      }
    }
  }

  s = parseInt(s);
  return s;
}

solution("2three4fivefivefivefivesixseven"); //정상적으로 234555567 출력.

 

그러고보니 0번째 문자가 zero부터 시작하니...

굳이 numbers라는 배열을 만들어줄 필요는 없었군... ~.~;

 

 

내가 하고 싶었던 모범 답안이 있길래 복사해 옴 ↓

아직 객체 다루는 게 익숙하지 않네... 

function solution(s) {
    let charSet = {
        "zero" : 0,
        "one" : 1,
        "two" : 2,
        "three" : 3,
        "four" : 4,
        "five" : 5,
        "six" : 6,
        "seven" : 7,
        "eight" : 8,
        "nine" : 9,
    }

    for(let [key, value] of Object.entries(charSet)) {
        let re = new RegExp(key,"g");
        s = s.replace(re, value);
    }
    return parseInt(s);
}

'코테연습' 카테고리의 다른 글

[LeetCode] Longest Common Prefix  (0) 2022.03.09
[LeetCode] Roman to Integer  (0) 2022.02.13
[프로그래머스] 약수의 개수와 덧셈  (0) 2022.02.09

댓글()