ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 배열에서 최대값, 최소값 구하기
    Language/JavaScript 2022. 10. 29. 22:42

    Q. find_longest_word 함수를 만들어 주세요.

    주어진 리스트안에 있는 단어중 가장 긴 단어를 찾을수 있도록 함수를 완성해주세요.

    console.log(find_longest_word(["PHP", "Exercises", "Backend"])) 
    // --> "Exercises"

    이 문제는 풀이 접근을 잘 못했던 문제다.

    1. 단어의 길이 수를 구한다.

    2. 가장 긴 단어의 길이 수를 뽑는다.

    3. 그 단어를 반환한다.

     

    이 로직을 구현하기 위해 코드를 작성하고자 했으나, 가장 긴 단어의 길이를 구하는 로직이 복잡하게 느껴졌다.

    배열에 있는 모든 요소의 길이를 구하고, 그 길이를 전부 개별로 비교할 수 있는 로직.

    그래서, 첫 요소와 나머지 요소를 모두 비교하고 첫 요소보다 길이가 긴 요소만 필터링하고

    필터링된 요소를 다시 똑같은 작업을 하고, 같은 작업을 계속 반복하다보면 가장 긴 단어 하나만 남지 않을까?

    라는 생각을 했고 그 로직을 구현하고자 했다.

     

    그래서 for loop로 구현하고자 했지만 문제가 있었는데, 그 작업을 어느정도 반복해야 하는지를 정해야하는 한계가 있었다.

    즉, 단 하나의 값이 배열에 남을 때 까지 for loop를 돌려라. 라는 코드를 구현하는 것에 실패했다.

    function find_longest_word(arr) {
      let filteredArr = [];
      arr.filter( (item,i,arr) => {
        if (i < arr.length &&  arr[i].length >= arr[i+1].length) {
          filteredArr.push(arr[i])
     		}
      	})
      return filteredArr
      }
      
      find_longest_word(["PHP", "Exercises", "Backend"])
      // TypeError: Cannot read properties of undefined (reading 'length')

    해당 로직을 제대로 구현한 것인지는 모르겠으나 일단 결과는 TypeError: Cannot read properties of undefined (reading 'length')였다. 관련 에러를 찾아보니 이런 말들이 많았다. "길이를 구하려는 요소가 존재하는지 확인해보아야 한다 undefined일 것이다."

    그런데 나는 undefined를 넣지 않았는데 왜 그럴까?

     

    생각을 해보니 arr[i+1]은 가장 끝 배열에서 정의되지 않는, 즉 undefined 값이었기 때문에 length 프로퍼티가 적용이 되지 않았던 것이다. 그래서 for loop로 가서 순회의 조건을 수정했다.

    function find_longest_word(arr) {
      let filteredArr = [];
      for (let i = 0; i < arr.length-1; i++) {
        if (arr[i].length >= arr[i+1].length) {
          filteredArr.push(arr[i])
        } else if (arr[i].length < arr[i+1].length) {
          filteredArr.push(arr[i+1])
        } 
      }
      return filteredArr
    }
    
    find_longest_word(["PHP", "Exercises", "Backend"])
    // ["Exercises", "Exercises"]
    
    find_longest_word(["PHP", "Exercises", "Backend", "Javascript"])
    // ["Exercises", "Exercises", "Javascript"]

    for loop를 돌리는 것 까지는 성공했다. 하지만 이 코드는 미완이었다. 왜냐하면 함수의 인자로 들어가는 배열의 길이가 길어지면 문제가 생긴다. for loop를 한 번 돌리는 것으로는 안되는 것이었다.

     

    그래서 결국 이 문제는 답을 보았다.

    정확히 말하면 전에 비슷한 문제를 만났었기 때문에 그 문제의 답을 참고했다.

    function find_longest_word(arr) {
      let max = arr[0]
      arr.forEach((item, i, arr) => {
        if (arr[i].length > max.length) {
          max = arr[i]
        }
      });
      return max
    }
    
    console.log(find_longest_word(["PHP", "Exercises", "Backend"])) 
    // --> "Exercises"
    // 최소값은 위의 값 비교를 반대로 하면 된다.

    기억을 떠올려보니 당시에도 비슷한 풀이를 하려다가 실패했었다. 같은 로직의 문제풀이였기 때문에, 다음부터는 배열 요소 안에서 최소값, 최대값 구하는 것은 이런 방식으로 해야겠다고 생각했지만, 다시 비슷한 문제를 만났을 때 뱉어내지 못했다.

     

    처음 나의 접근 : 배열 요소 중 가장 큰 값을 찾아 새로운 배열에 할당해라.

    1. 배열의 첫 번째 요소보다 큰 요소들로 구성된 배열을 만들고 => 그 배열에서 다시 첫 번째 요소보다 큰 요소들로 구성된 배열을 만들고 => 동일 동작 반복 => 배열 요소가 1개만 남을 때, 그 것이 최대값

    2. 배열의 i 번째 요소와 i+1번 째 요소를 비교하여 큰 값을 리턴 => 그렇게 만든 배열에서 동일 동작 반복 => 배열 요소 1개 남을 때 그것이 최대 값

     

    문제의 해법 : 배열 요소 중 가장 큰 값을 변수에 할당해라.

    첫 번째 요소가 최대 값이라고 정의 => 비교하는 요소가 현재 최대값보다 크다면 현재 최대값을 그 값으로 대체 => 배열 끝까지 비교한 후 최대값으로 변수에 할당된 값이 최대 값.

     

    이 문제를 해결하지 못한 이유는, 수학적으로 접근하지 못했기 때문인 것 같다.

    수학으로 따지면, max라는 변수의 선언은 우리가 구하고자 하는 값을 미지수 x로 두고 그 해를 찾는 과정과 같다. 

    다만, 그 해가 유일하다면 변수에 할당하여 찾아가기 시작하면 되고

    그 해가 여러개이거나 범위를 갖는다면 배열에 할당하고 찾아가면 된다.

    댓글