code camp 문자열 중 가장 긴 단어 찾기 해결방법 풀이하기 (reduce,map,재귀)

2021. 7. 3. 15:14JS/알고리즘

1. reduce 사용 방법

function findLongestWordLength(s) {

return s.split(' ')

.reduce(function(longest, word) {

return Math.max(longest, word.length)

}, 0);

}

console.log(findLongestWordLength("See you later")) // 5

 

1. "See you later"를 findLongestWordLength의 매개변수 s에 제공됩니다.

2.  s는 split 메서드를 이용해 ' ' 공백을 기준으로 문자열을 분할해서 배열에 넣은 다음 배열을 반환합니다.

[결과]  [ 'See', 'you', 'later' ] 됩니다. 그러면 가장 긴 문자열을 찾기 쉬워지겠죠.. 

3. reduce를 이용해 가장 긴 문자열을 찾는 작업을 진행합니다. initialValue 값이 0이므로 longest는 0이 되고 word는 0이 됩니다.

longest 0 word See Math.max 3
longest 3 word you Math.max 3
longest 3 word later Math.max 5

결국 Math.max [5]를 return 하여 결괏값은 5입니다. 

Math.max는 매개변수 중 가장 큰 값을 반환하므로 비교할 때마다 큰 값이 반환되어 longest에 할당됩니다. 그렇게 전의 숫자와 계속 비교하며 가장 길이가 긴 문자열을 찾는 코딩이네요.

 

2. map 사용 방법 

function findLongestWordLength(str) {

return Math.max(...str.split(" ").map(word => word.length));

}

console.log(findLongestWordLength("See you later")) // 5

 

str에 "See you later"이 제공됩니다. ...str.split(" ")으로 문자열을 배열로 분할하고 공백을 구분 기호로 사용합니다. 그런데 여기서 의문은.. 

....str.split(" ") 은 See you later 이 값을 출력 

str.split(" ")은 [ 'See', 'you', 'later' ] 이 값을 출력

한다는 것이고 결국 결과 값은 같습니다. 제가 생각하는 이상적인 배열은 str.split인데 '...'을 사용하고 안하고의 차이가 의문이네요.

그렇게 만들어진 배열을 가지고 map을 이용해 각 단어의 길이에 해당 하는 새로운 배열을 만듭니다. 그럼 [3,3,5]가 return 되고 결국 Math.max에서 5를 가장 큰 수로 return 하게 됩니다.

 

 

3. 재귀 사용 방법

function findLongestWordLength(str) {

 

const words = str.split(" ");

 

if (words.length == 1) {

return words[0].length;

}

 

return Math.max(

words[0].length,

findLongestWordLength(words.slice(1).join(" "))

);

}

console.log(findLongestWordLength("See you later")) // 5

이해하기 힘든.. 재귀 함수... 일단 이해한 것에 따르면..

처음에 str에 입력받은 문자열을 wordrs 변수에 공백 분할하여 배열로 넘깁니다. 

if문을 만나고 wrods.length 길이가 1인가? 를 묻습니다. 그 길이가 1이 되면 바로 그것이 최대 값이 되는 것이 이 함수입니다. 

처음은 See you later 가 있어 length가 1이 아니므로 밑으로 내려갑니다. 

Math. max 안에서 일어나는 일..

words[0].length      findLongestWordLength(words.slice(1).join(" ")

3                        you, later

3                         later

5

Math. max   최종적으로 (3 , 3 , 5 ) 중 가장 큰 값 5를 return 한다.라고 이해하였습니다. 

 

*findLongestWordLength(words.slice(1).join(" ")

slice를 1부터 끝까지 만 입력받도록 해서

See you later

you later

later

되는 구조

 

재귀함수를 쉽게 가르켜 주는 stackoverflow의 답변 

https://stackoverflow.com/questions/33923/what-is-tail-recursion