Your order, please<6 kyu>

jjanmo·2020년 2월 12일
0

Codewars에서 뒹굴기

목록 보기
32/32

문제링크

문제

Your task is to sort a given string. Each word in the string will contain a single number. This number is the position the word should have in the result.

Note: Numbers can be from 1 to 9. So 1 will be the first word (not 0).

If the input string is empty, return an empty string. The words in the input String will only contain valid consecutive numbers.

Examples

"is2 Thi1s T4est 3a"  -->  "Thi1s is2 3a T4est"
"4of Fo1r pe6ople g3ood th5e the2"  -->  "Fo1r the2 g3ood 4of th5e pe6ople"
""  -->  ""

🚩 주어진 문장의 단어에는 각각 숫자가 들어있는데, 그 숫자의 순서에 따라 문장을 정렬하시오

문제접근

function order(words){
  const arr = [];
  words.split(' ').forEach(word=>{
    let idx = 0;
    word.split('').forEach(char=>{
      if(!isNaN(char)) idx = Number(char);
    });
    arr[idx-1] = word;
  });
  return arr.join(' ');
}

이중 for문(for문 대신 forEach())을 돌려야만 하는 것인가? 생각해보면 안쪽 forEach()는 배열로 사용하기 위해서 바꿀 필요가 없었던 것 같다. ( word.split('') 부분 ) 어차피 숫자인지 아닌지를 확인하고 그 숫자를 인덱스로 하는 배열에 넣어주면 되었기 때문이다. 그리고 forEach() 같은 경우엔 중간에 break를 할 수 없다. 그런데 위의 문제에서는 단어마다 숫자가 나오면 처리해주고 다음 단어로 넘어가면 된다. 이럴 경우는 break를 써서 루프를 빠져나가는게 효율성이 좋기 때문에 이 문제는 forEach()보다는 그냥 for문을 사용해서 푸는편이 더 나은 것 같다.

사실 처음 생각했던 풀이는 각각의 단어를 객체로 만들어서 순서대로 뽑아올 수 있도록 만들면 되지 않을까 생각했었다. 그럼 어떻게 객체를 만들것인가가 문제이다. 각 단어에 속한 숫자key가 되고 각 단어value가 된다. 그럼 그 숫자를 어떻게 찾을 것인가? 여기가 문제 였다. 어쨌든 각 단어에 속한 숫자를 알기 위해선 무조건 각 단어를 살펴봐야했다. 그 말은 결국 순회를 2번 해야한다는 말이 된다. 그래서 이 생각은 폐기처분(?)...😭

Best Solution

function order(words){
  
  return words.split(' ').sort(function(a, b){
      return a.match(/\d/) - b.match(/\d/);
   }).join(' ');
} 

어제 공부했다, 정규표현식, \d의 의미를...
그런데 이것을 이런 식으로 활용할 줄은 생각지 못했다. 단어의 띄어쓰기를 기준으로 나눈 배열에서 각 단어의 숫자만을 기준 삼아서 정렬(오름차순)을 하는 코드이다.
a.match(/\d/) : a에서 숫자와 일치하는 것을 찾는다.

모르는 코드는 하나도 없는데, 뭔가 새롭다. 알아도 아는게 아니다...😭

결론

정규표현식을 사용하려고 노력해보자. 무엇인가를 찾고자 할 때, 그냥 단순하게 ===!==를 이용해서 사용하는 것 보다는 정규표현식을 사용해 보도록 하자. 또한split(), match(), replace(), search() 등과 같은 Array 혹은 String 관련 메소드를 사용할 때도 정규표현식을 이용해서 다시 한 번 생각해보는 연습을 하자.

profile
눈길을 걸어갈 때 어지럽게 걷지 말기를.

0개의 댓글