[JS] 배열의 중앙값 구하기

김zunyange·2023년 6월 22일
0

알고리즘

목록 보기
5/7
post-thumbnail

문제 설명

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

제한 사항

  • array의 길이는 홀수입니다.
  • 0 < array의 길이 < 100
  • -1,000 < array의 원소 < 1,000

입출력 예

arrayresult
[1, 2, 7, 10, 11]7
[9, -1, 0]0

내 풀이법

  1. 우선 배열을 오름차순이든 내림차순이든 정렬한다. 어차피 가운데 값은 같을 테니!
    나는 오름차순을 선택했다. sort()
  2. 가운데 값을 구하려면 배열 길이를 2로 나누고 올림하면 된다고 생각했다.
    예) 9 : 9/2 = 4.5 가운데 숫자의 순서는 5번째
    15 : 15/2 = 7.5 가운데 숫자의 순서는 8번째
    그래서 올림 메서드 Math.ceil을 써서 가운데 요소의 순서를 구했고, 인덱스 번호는 순서에서 -1을 해줘야되므로 아래와 같이 코드를 작성했다.
function solution(array) {
    const array2 = array.sort();
    const middle = Math.ceil(array2.length / 2);
    return array2[middle-1];

}

잘했다 생각했는데 4문제 통과/6문제 실패 🥲

무엇이 문제일꼬 🤔


테스트를 추가해보았다. result 로 22가 출력되어야 한다.

허거거겅 29가 나왔다.
차근차근 다시 생각해보자.

array = [43, 29, 60, 18, 5, 22, 19]
const array2 = array.sort() = [5, 18, 19, 22, 29, 43, 60];
const middle = Math.ceil(array2.length / 2) = Math.ceil(7 / 2);
const middle = 4;
return array2[middle-1] = array2[3] = 22; 

22맞는데 ........!
console.log 를 찍어봐야겠다.

이럴수가!! 오름차순 sort부터 잘못됐다. 테스트 추가하기 전에 console.log(array2) 를 찍어보긴 했지만 테스트 1,2 가 잘 나와서 문제 없다고 생각했는데 왜 5가 맨앞으로 안간걸까??

찾아보니 나와 유사한 답변을 한 분이 있었고 그분의 질문에 대한 답변을 볼 수 있었다.

🔥 sort()는 문자열의 유니코드 순서를 따르므로 number type의 오름차순 정렬을 원하신다면 sort((a,b) => a-b)를 사용하셔야 합니다. 라는 답변 !!

전에 알고리즘 문제를 풀때에도 종종 오름차순, 내림차순 메서드를 써야될 때가 있었는데 그때는 검색을 한거라 바로 복붙을 했던건데 오늘은 검색을 안하고 a-b 인지 b-a인지 까먹고 그냥 sort()까지만 입력하고 console.log 로 출력이 잘 나와서 넘어갔던거여서 문제가 발생한 것이다.

//오름차순 잘못 썼을 때
const array2 = array.sort();
//오름차순 올바르게 수정
const array2 = array.sort((a,b) => a-b);

최종 답변

function solution(array) {
    const array2 = array.sort((a,b) => a-b);
    const middle = Math.ceil(array2.length / 2);
    return array2[middle-1];

}

깔끔하게 이렇게 작성할 수도 있다.

function solution(array) {
  return array.sort((a, b) => a - b[Math.floor(array.length / 2)];
}
profile
배움은 즐거워 ~(*ૂ❛ᴗ❛*ૂ)

0개의 댓글