JS 알아보기...Sort

최창연·2025년 1월 2일

JS 입문기

목록 보기
1/3
post-thumbnail

최근에 JS로 알고리즘을 풀고 있었는데 정렬을 해야되는 일이 있었다.

이 문제를 풀기 위해서 2차원 배열에서 가로와 세로의 길이를 정렬하고
정렬된 2차원 배열의 [0]값 중에 최대값과 [1]값 중에 최대값을 구해서
문제를 풀려고 생각했다.

function solution(sizes) {
    var answer = 0;
    var left = 0, right = 0;
    var temp = [0, 0];
    sizes.forEach((size) => {
        size = size.sort();
        temp[0] = temp[0] < size[0] ? size[0] : temp[0];
        temp[1] = temp[1] < size[1] ? size[1] : temp[1];
    })
    return temp[0] * temp[1];
}

실제로 구현한 코드이다.
당연히 테스트 케이스는 잘 통과했었는데 웬걸..?
제출하면 절반정도 틀리는 것이다.
처음에는 JS에서는 정렬이 다른 기준으로 작동되는 걸로 착각했다.
그러나 나중에 알게된 사실로는 JS의 데이터 타입은 런타임시 결정된다는 것이다.

제출했을 때 입력되는 2차원 배열을 데이터 타입을 모르기도 하고,
또 그렇기 때문에 number 타입은 정렬이 의도대로 작동했지만
string 혹은 이외 다른 타입의 값들은 의도와 다르게 동작한 것이다.

예시1) 10과 9로 인자가 존재한다면?
정렬결과 -> 9, 10

예시2)"10"과 "9"로 인자가 존재한다면?
정렬결과 -> "10", "9"


위 내용 수정합니다. (25년 1월 8일 기준)
js에서는 기본적으로 sort() 함수에 대해서 unicode를 통한 정렬을 진행한다.
그렇기 때문에 아래와 같은 다른 방식을 통한 정렬을 진행하거나,
callback 함수를 작성하여 기준을 정할 수 있다.


이 때문에 곧바로 정렬을 사용하기 힘들고
형변환 혹은 아예 다른 방식으로 문제를 풀어야 했다.

function solution(sizes) {
    var answer = 0;
    var temp = [0, 0];
    sizes.forEach((size) => {
        const [w, h] = size[0] < size[1] ? [size[1], size[0]] : size;
        temp[0] = Math.max(temp[0], w);
        temp[1] = Math.max(temp[1], h);
    })
    return temp[0] * temp[1];
}

나는 삼항 연산자를 통해 정렬을 하고 문제를 풀 수 있었다.
확실히 JS의 데이터 타입이 비교적 다른 언어에 비해 자유로운걸 다시 한 번 깨닫게 된 계기였다.

profile
사용자와 소통하는 프론트엔드 개발자

0개의 댓글