이번 튜토리얼에서는 문자열을 입력받아 해당 문자열에서 가장 짧은 단어와 가장 긴 단어를 각각 배열 형태로 반환하는 JavaScript 함수를 작성해 보겠습니다.
문제 이해하기
예를 들어, 다음과 같은 문자열이 있다고 가정해 봅시다.
const str = "Hardships often prepare ordinary people for an extraordinary destiny";
이 문자열에서 각 단어의 길이를 비교하면, 가장 짧은 단어는 'an'(2글자)이고 가장 긴 단어는 'extraordinary'(13글자)입니다.
따라서 함수의 출력 결과는 다음과 같아야 합니다.
const output = ["an", "extraordinary"];
해결 방법
이 문제는 다음과 같은 순서로 해결할 수 있습니다.
split(" ")메서드를 사용해 문자열을 공백 기준으로 분리하여 단어 배열을 만듭니다.- 배열의 첫 번째 단어를 최솟값(min)과 최댓값(max)의 초기값으로 설정합니다.
- 반복문을 돌며 각 단어의 길이를 비교하여 더 짧은 단어와 더 긴 단어를 갱신합니다.
- 최종적으로
[min, max]형태의 배열을 반환합니다.
코드 구현
위 로직을 실제 코드로 구현하면 다음과 같습니다.
const str = "Hardships often prepare ordinary people for an extraordinary destiny";
const largestSmallest = str => {
const strArr = str.split(" ");
let min = strArr[0];
let max = strArr[0];
for(let i = 1; i < strArr.length; i++){
if(strArr[i].length < min.length){
min = strArr[i];
}
if(strArr[i].length > max.length){
max = strArr[i];
}
}
return [min, max];
};
console.log(largestSmallest(str));실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
[ 'an', 'extraordinary' ]
추가 팁: reduce() 메서드 활용하기
같은 기능을 reduce() 메서드를 사용해 더 간결하게 구현할 수도 있습니다.
const largestSmallest = str => {
const words = str.split(" ");
const min = words.reduce((a, b) => b.length < a.length ? b : a);
const max = words.reduce((a, b) => b.length > a.length ? b : a);
return [min, max];
};두 방법 모두 시간 복잡도는 O(n)으로 동일하지만, reduce()를 사용하면 코드가 더 선언적이고 읽기 쉬워진다는 장점이 있습니다. 상황에 맞게 적절한 방법을 선택하시면 됩니다.