오늘의 코딩테스트 한줄 - 중앙값 구하기

Edwin·2023년 1월 31일
0
post-thumbnail

중앙값 구하기

프로그래머스, 중앙값 구하기
중앙값은 어떤 주어진 값들을 크기의 순서대로 정렬했을 때 가장 중앙에 위치하는 값을 의미합니다. 예를 들어 1, 2, 7, 10, 11의 중앙값은 7입니다. 정수 배열 array가 매개변수로 주어질 때, 중앙값을 return 하도록 solution 함수를 완성해보세요.

1) 문제풀이, 구글링

1) 최대값(Math.max)
2) 최소값(Math.min)
3) 중앙값은? 따로 구하는 메소드가 없는 것 같다. sort를 통해서 요소를 정리한 후에 가공할 필요가 있어 보인다.

나의 시도

function solution(array) {
    let answer = array.reduce((prev, cur) => {
        return prev+cur;}, 0);
    return parseInt(answer/array.length)
}

reduce()를 통해서 배열데이터를 전부 합산한 후에 나눔셈을 하였고, 소수점은 버리고 산출하려고 했다. 문제는 이러한 식의 발상이 오류를 발생시킨다는 점이다.

[9, -1, 0] 이라는 배열이 주어졌다고 하자. 합산은 8이고 이를 3으로 나누면, 2.... 이다. 그러나 배열에서 중앙값은 0이기에 오류를 발생시킨다.

[1,2,3,4,5] 라는 배열에서는 아마도 정상적으로 작동할 것이다. 합산은 15이고, 이를 5로 나누면 3이되기 때문이다. 그러나 항상 중앙값을 구하지 않는다는 점에서 이 코드는 잘못되었다.

바른 접근

function solution(array) {
   array.sort((a,b) => a-b);
   let answer = Math.floor(array.length/2);
   console.log(array);
   console.log(array[answer]);
  return array[answer]
}

solution([1,23,3,4,7,5, -12, -23, 100])

위의 코드를 codepen에다가 기록해보자. 그려면 중앙값인 4가 출력될 것이다.

  • array.sort((a,b) => a-b); = [-23,-12,1,3,4,5,7,23,100]
  • 배열데이터가 9개인데, 그중에 5번째 위치한 곳의 숫자를 보면 4이다.

배열의 길이에서 중앙으로 돌아가기 위해서 Math.floor와 (array.length/2)가 기록되었다.

  • (array.length/2)로 접근해 보면 짝수인 배열에서는 이상적일 것이다. 그러나 홀수인 배열에서는 문제가 발생될 것이다. 9/2는 4.5, 11/2는 5.5이기 때문이다. 배열에서 array[4.5], array[5.5]는 찾을 수 없다. 그러기에 오류가 발생된다. 그렇다면 이를 바로 잡아줄 필요가 있다.
  • Math.ceil일까 Math.floor일까?
    일상의 숫자에서는 1부터 시작하기에 ceil() 생각할 수 있다. 그러나 컴퓨터는 숫자를 0부터 세는 것을 기억하면, floor()을 해야 정확한 위치의 값을 찾을 수 있다는 것을 기억하자.

2) 다른풀이

여기서 관건은 소수점의 자리를 버린다는 점이다. 이런 점에서 Math.floor()도 있지만, .paraInt()를 통해서 소수점을 버리고 양수만 가져울 수 있다.

profile
신학전공자의 개발자 도전기!!

0개의 댓글