본문 바로가기

카테고리 없음

(좋은 코드의 작성을 위해) getLongestElement

getLongestElement

문제

문자열을 요소로 갖는 배열을 입력받아 배열에서 가장 긴 문자열을 리턴해야 합니다.

입력

인자 1 : arr

  • string 타입을 요소로 갖는 배열

출력

  • string 타입을 리턴해야 합니다.

주의 사항

  • 반복문(for, while) 사용은 금지됩니다.
  • 가장 긴 문자열이 중복이 될 경우, 앞 쪽에 있는 요소를 리턴해야 합니다.
  • 빈 배열을 입력받은 경우, 빈 문자열을 리턴해야 합니다.

mine

function getLongestElement(arr) {
  if(arr.length !== 0) {
    return arr.reduce((acc, cur) => {
      if(acc.length >= cur.length) {
        return acc;
      } else {
        return cur;
      }
    })
  } else {
    return '';
  }
}

reference

function getLongestElement(arr) {
  return arr.reduce(function (a, b) {
    if (a.length >= b.length) {
      return a;
    } else {
      return b;
    }
  }, '');
}

지금까지 reduce의 용법을 약간 오해하고 있었다. acc, cur로 표시되는 초기값과 현재값은 알았지만 arr.reduce에서 조건에 의해 return a;를 하게 되면 반환된 a의 값이 acc에 할당이 되는 것이었다. 놀랐다....지금까지 이런 이해없이 그냥 관습적으로 코드를 짜고 있었기 때문이다. 반환되는 값의 처리에 대한 이해가 없으니 위의 코드에 대한 완전한 이해가 없었고 복습하는 지금의 시점에서 이 문제를 발견할 수 있었다. 아고라에 질문을 검색하니 내가 한 질문만 있었다. 그때도 no 이해, 그나마 지금은 이해를 하였다.

 

arr에 [one, two, three]가 들어온다고 가정해보겠습니다.
써주신 코드를 보면 초기값으로 빈문자열을 넘겨주었기 때문에
첫 누적값(a)에 빈문자열이 할당됩니다. 현재값(b)에는 'one'이 할당되어
a.length(0) < b.length(3)이기 때문에
'one'이 리턴되면서 누적값(a)에 빈문자열 대신 'one'이 할당됩니다.
이런식으로 조건에 따라 누적값(a)가 갱신되면서 마지막 누적값(a)가
최종 리턴값 ('three')이 되는 것입니다.

 

누적값이 갱신되면서 가장 긴 문자열이 누적값으로 쌓이고 배열을 모두 다 순회하면 최종값이 반환된다. 잘하자.