본문 바로가기
D.evelop [CS]/Algorithm

[Algorithm 003] JS - 가장 긴 단어 찾기

by Danne 2021. 9. 11.

Q. 주어진 리스트 안에 있는 단어 중 가장 긴 단어를 찾을 수 있는 함수 만들기

//주어진 단어 예
console.log(find_longest_word(["PHP", "Exercises", "Backend"]))

 

 

A. 처음 접근 법

1.  먼저 각 배열값을 다 돌아 글자수를 카운터한다. 

 - 각 배열을 다 돈다 (for 문)

-  string값 1자씩 나눠  array의 길이를 구한다. (split, length)

2. 그 길이를 비교해 최대값을 찾는다. (Math.max)

3. 해당 인덱스값에 담긴 단어를 반환한다.

function find_longest_word(arr) {

  let wordLength = []
  for (let i=0; i<arr.length;i++){ 
      wordLength.push(arr[i].split("").length)
  }
  return wordLength

}

// [3, 9, 7]
  • 새로운 배열 wordLength를 생성해 단어의 길이 값만을 담기로 했다.
  • for문을 사용해 배열이 각 요소를 돌아가며
  • split메서드를 사용해 string을 array로 만들었다. 그리고 그 length를 구한 뒤
  • push를 사용해 wordLength배열에 담았다.

이까지해서

(예시) wordLength = [3, 9, 7]이 되었다.

 

 

그러나 다음 부분에서 어려웠다.😰

  • 각 값을 비교하는 로직
  • 최대 값에 해당하는 index를 다시 arr에서 찾는 것

 

 

A. 동기분의 풀이 법을 참고해서 계속 이어가본 로직

function find_longest_word(arr) {

  let wordLength = []
  for (let i=0; i<arr.length;i++){ 
  	wordLength.push(arr[i].split("").length)
  }
  let maxLength = Math.max(...wordLength)       // 9
  let longestWord = wordLength.indexOf(maxLength) //1

  return arr[longestWord]
  
}

//'Exercises'
  • Math.max()메서드를 활용해서 바로 최대값 구해버리기.
    • 처음 Math.max(myTxt)를 작성했을 때 계속 NaN이 떠서 제쳐뒀었는데,
    • "배열"에서 Math.max를 사용하려면 배열명 앞에 "..."을 꼭 붙여야한다고 한다. (MDN명세)
  • 그래서 9라는 최대값을 구할 수 있었다.
  • 다시 myTxt배열에서 9값을 가진 요소의 index인 1을 찾는다. (indexOf()메서드 사용)
  • parametar로 받았던 arr배열에서 구해둔 index값을 사용해 요소값을 반환시킨다.

 

동기분들의 피드백과 Tip으로 다시 풀어본 방법들)

 

B. map메서드을 사용해 본 방법

 function find_longest_word(arr) {
  
  let wordLength = arr.map(x=>x.length)
  let maxLength = Math.max(...wordLength)
  let longestWord = wordLength.indexOf(maxLength)
  
  return arr[longestWord]

}

//'Exercises'

 

  • 내가 작성했던 for문 대신 map메서드를 사용해 보다 간단한 방식으로 length 값을 구할 수 있었다.

Array.map() : 주어진 함수로 배열의 모든 요소를 실행시켜 새로운 배열을 반환하는 메서드 (전에 정리해 둔 것)

 

 

 

C.  if문을 사용해 본 방법 

function find_longest_word(arr) {

  let longestWord = '';
  for (let i=0; i<arr.length;i++){ 
    if(arr[i].length > longestWord.length){
      longestWord = arr[i]
    }
  }

  return longestWord
}

//'Exercises'


find_longest_word(["PHP", "Exercises", "Backend"])
  • 처음 접근 한 방식에에서 split이 아닌  if문과 string의 length를 사용한 방법.
  • 현재의 longestWord.length과 1씩 증가한 index의 요소값 차례로 비교
  • 조건에 만족한 값만 longestWord에 남기고
  • 제일 마지막에 남은 longestWord값은 반환

이 함수의 경우 이전의 로직보다 많은 변수를 생성하지 않으므로, 메모리 낭비를 막을 수 있다고한다.

for문 실행

arr[0].length = 3 >  wordLength에 값이 없음 = 0
( if조건 맞음 )

if 문 실행 : wordLength에 arr[0]값 "PHP" 담김

for문 실행

arr[1]의 "Exercises" length = 9 >  wordLength.length = 3
( if조건 맞음 )

if 문 실행 : wordLength에 arr[1]값 "Exercises" 담김

for문 실행

arr[2]의 "Backend" length =  7 >  wordLength.length  =  9
( if조건 안 맞음 )

for문 나감, 최종 wordLength값 "Exercises" 반환

 

ES6방식으로 for문 수정해보기

function find_longest_word(arr) {

  let wordLength = '';
  for (let i in arr){
    if(arr[i].length > wordLength.length){
      wordLength = arr[i]
    }
  }

  return wordLength

}

 

 

 

 

반응형

댓글