[TIL] 23.04.08.

2023. 4. 8. 22:12개발일기

오늘의 학습 내용

  • 알고리즘 마라톤
  • 자바스크립트 동작 원리

새로운 배움

1. 자바스크립트 Array.sort()의 함정

문제

여러 직사각형 사이즈가 주어질때 주어진 모든 직사각형 사이즈를 포함할 수 있는 최소 직사각형 사이즈를 구하는 알고리즘 문제를 풀고 있었다.

고스톱 칠때나 카드를 섞어서 정리할때 일단 모든카드의 짧은면은 짧은면끼리 긴면은 긴면끼리 오게 한다음 정리하는 것을 생각해서 주어진 직사각형 사이즈의 크기를 긴면과 작은면으로 구부한뒤 정렬을 통해 각각의 면에서 가장 큰 사이즈를 찾아서 구하려고 로직을 작성 하였다.

테스트 케이스는 통과하는데 실제로 제출을 할 경우 50% 정도의 테스트 케이스에서 적절한 답을 제출하지 못했다... 뭐가 문제지..

시도

생각한 로직이 문제인가 싶어서 다른 방식도 생각해봤지만... 계속해서 문제가 발생.. 혹시 속도에서 문제가 생기는 것일까 싶어서

포문의 사용을 줄여보았다. 실패.

콘솔로그의 양이 많은가 싶어서 줄여보았다. 실패

 

해결

테스트 케이스에서 정렬이 잘 되는 것을 확인했기 때문에 

정렬 문제가 아니라고 생각했는데 혹시 몰라서 여러개의 테스트 케이스를 더 추가해서 테스트 하던 중 정렬이 정상적으로 되지 않고 있다는 것을 확인했다.

 

자바스크립트 Array.sort()를 사용했는데 따로 비교를 하기 위한 함수를 추가적으로 선언해주지 않을 경우 아스키 코드 기준으로 비교 하여 정렬을 한다고 하였다.

그래서 숫자 10, 9, 8, 1이 주어질때 정렬을 하게 되면 1, 10, 8, 9 순으로 정렬된다.

 

문자열을 비교하여 정렬할 경우 정렬이 올바르게 되지 않는다는 사실은 알고 있었지만 배열의 값이 숫자이더라도 비교함수를 선언하지 않으면 문자열로 받아서 비교한다는 사실은 처음 알게 되었다.

 

사실을 알고나서 관련 자료를 찾아보니 떡하니 적혀있었다.....

 

Array.prototype.sort() - JavaScript | MDN

sort() 메서드는 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환합니다. 정렬은 stable sort가 아닐 수 있습니다. 기본 정렬 순서는 문자열의 유니코드 코드 포인트를 따릅니다.

developer.mozilla.org

느낀점

레퍼런스를 늘 토시 하나 안틀리고 외울 순 없겠지만 이렇게 유명한 함정?은 꼭 알아둬야한다고 생각했다.

단순히 학습이 아니라 다양한 예시 케이스를 통해 이런 부분들을 익힐 수 있기 때문에 알고리즘 코딩테스트나 혹윽 직접 코드를 짜고 실수하는 과정이 중요하다고 생각한다.

 

관련 작성글

 

최소직사각형

최소직사각형 코딩테스트 연습 > 완전탐색 > 최소직사각형 문제 설명 명함 지갑을 만드는 회사에서 지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서,

youngsimi.tistory.com

 

 

[JS] 자바스크립트 배열 정렬, 조금 남다른 Array.sort()

자바스크립트 내장 객체 Array 자바스크립트에 내장되어있는 객체로 단일 변수명 아래 여러 항목을 모아서 저장 가능하다. Description 서로 다른 데이터 유형을 혼합하여 저장할 수 있다. 0부터 인

youngsimi.tistory.com

 

'개발일기' 카테고리의 다른 글

[TIL] 23.04.11.  (0) 2023.04.11
[TIL] 23.04.10.  (0) 2023.04.11
[TIL] 23.04.07.  (0) 2023.04.07
[WIL] 23.04.03. - 23.04.06.  (0) 2023.04.07
항해 99 1주차 토이프로젝트 주간 회고  (0) 2023.04.05