티스토리 뷰

반응형

 

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

 

문제를 보고 뭔가 금방 풀 수 있을 것 같았다..

꼭 마지막 예외처리에 안 되어버리면 붙들고 있게 되는데 오늘은 이 마지막단계에서 이 문제를 3시간 동안 붙들고 있었다 ㅠㅠ

 

다른 분들이 푼 답을 보니 정규표현식으로 해결이 가능한 것이었다. 어제 정규표현식 관한 문제를 풀어서 생각을 안 했던 것은 아닌데 안 쓰고 풀고 싶었나 보다..

 

 

 


 

제출 답안 

내가 제출한 답안은 테스트 케이스가 무조건 오름차순일 때나 내림차순으로 쓰였을 때,  sort()를 쓰면 정렬이 되므로 정답처리까지는 되었을 것이다. 

 

하지만 문제는 오름차순이나 내림차순이 아니며, 랜덤으로 배치되고 중복까지 허용한다.

"1zerotwozero3" 은 1020으로 나와야했고, 내 코드는 뒤에 zero를 체크하지못해 1023만 반환했다.
function solution(s) {
  let answer = 0;
  
  const table = [
    "zero",
    "one",
    "two",
    "three",
    "four",
    "five",
    "six",
    "seven",
    "eight",
    "nine",
  ];
  let convert = [];

  for (let i = 0, j = 0; i < s.length; ++i) {
    if (isNaN(s[j]) === false) {
      convert.push(s[j]);
    }
    if (s.indexOf(table[i]) !== -1) {
      let str = s.slice(
        s.indexOf(table[i]),
        s.indexOf(table[i]) + table[i].length
      );
      let num = table.indexOf(str);
      convert.push(num);
    }
    j += 1;
  }

  answer = +convert.join("");
  return answer;
}

// console.log(solution("one4seveneight")); // 1478
// console.log(solution("2three45sixseven")); // 234657
// console.log(solution("1zerotwozero3")); // 1023

 

 

올바른 답안  1) split(), join()을 이용한 풀이

정규표현식이 아닌 방법으로 푼 풀이 중 가장 직관적이면서 좋은 풀이법을 가져왔다.

split으로 문자열 사이의 영어를 나누고 나뉜 배열을 join()을 배열의 인덱스를 사용해 다시 숫자로 합치는 것이다.

간단해 보이지만 이런 발상으로 푼다는 게 결코 쉽지 않다. 덕분에 사고력은 길렀다.

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

 

 

올바른 답안  2) 정규표현식을 이용한 풀이

대부분 사람들이 이렇게 푼 것 같다. 사실문제 출제자도 정규표현식을 이용해서 풀으라는 목적으로 출제했을 것이다. 

근데 출제자가 의도하지 않은 위 풀이처럼 풀었다면 근데 잘 풀었고, 좋은 풀이라면?? 플러스일까 마이너스일까?

문제 의도를 잘 파악하는 걸 더 중요시한다면 아래의 풀이법이 더 좋겠지만, 사고력을 중요하게 여긴다면 윗사람 풀이를 더 좋게 봤을 것 같다. 

 

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

 

반응형