인자로 받은 문자열 중 가장 짧은 문자열을 리턴하라

박상록(Sangrok Park)·2020년 10월 8일
0
function findShortest(w1, w2, w3) {
  // 함수를 함께 작성해봐요.
}

만약에 이런 함수가 있다고 하고, 인자로 문자열인 w1, w2, w3을 받고 이 중 가장 짧은 문자열을 리턴해야 한다면.

나의 첫번째 함수 작성은 이랬다.

function findShortest(w1, w2, w3)
  let word1 = w1.length;
  let word2 = w2.length;
  let word3 = w3.length;

  if(Math.min(word1, word2, word3) === word1){
    return w1;
  } else if(Math.min(word1, word2, word3) === word2) {
    return w2;
  }  else if(Math.min(word1, word2, word3) === word3) {
    return w3;
  }

각 각의 길이를 변수에 담아주고, 그 변수에 담긴 길이들을 비교하여, 가장 짧은 길이에 매칭되는 글자를 출력하도록 했다.

"만약에 인자가 3개가 아니라 1000개라면, 혹은 10,000개라면?"

물론 당장 길이가 다른 1000개, 10,000개의 문자열을 받을 일은 없다고 하지만, 만약에 유동성이 필요한 코드가 필요할 때, 내가 쓴 코드는 인자가 많아지면 많아질수록 더 많은 양의 코드내용을 기록 해야하고, 또 어떤 인자가 몇개가 들어올지 모르는 상황에서는 쓸 수도 없는 코드이다.

그렇다면,

"이걸 어떻게 가변적인 개수의 인자가 들어왔을 때도 가동 가능한 코드로 만들까?"

라는 생각을 해봤고

흠...

이렇게 만들어봤다.

function findShortest(...args) { 
  let shortestWord = args.reduce( (acc, cur) => {
    if(Math.min(acc.length, cur.length) === acc.length){
      return acc;
    } else {
      return cur;
    }
  })

  return shortestWord;
}

테스트 해보면...

가장 짧은 글자를 잘 출력했다.

그런데 위의 예제만 봐도, 벌써 같은 글자수의 문자열이 많아보이는데, 그러면 글자 수가 가장 짧은 문자열이 많을 때 전부 다 출력하고 그것을 알파벳 순으로 정렬을 한다면 어떨까?

정말 문자열이 1000개, 10,000개라면 보통 배열형태로 들어오게 될테니까,
함수 매개변수를 spread parameter가 아닌 일반 매개변수로 바꿔주고,

이렇게 작성했다.

function findShortest(args) {
  const minimumNumber = args.reduce((acc, cur) => {
    return Math.min(acc, cur.length);
  }, args[0].length);

  
  let shortestWords= [];
  
  args.forEach( el => {
    if(el.length === minimumNumber) {
      shortestWords.push(el);
    }
  })

return shortestWords.sort();
}

각 문자열의 길이 중 최소 값을 minimumNumber에 할당한 후, 매개변수 args를 통해 들어오는 배열을 인자로 받아 forEach를 통해 반복하며 각 글자의 길이가 minimumNumber와 일치하면 그 글자는 shortestWords에 push하는 방식으로 했다. 그리고 sort()를 이용해 순서대로 정렬하였다.

결과는,

이렇게 잘 출력되었다.

Array.prototype.reduce()의 사용법과 인자들이 들어갔을 때 어떻게 쓰이는지 배울 수 있어 좋았던 것 같다.

reduce는 map과 마찬가지로 사용법이 아주 다양한 것 같아서 연구해 보는 것도 좋을 것 같다.

profile
한 줌의 소금과 같이 되고 싶은 개발자

0개의 댓글