본문 바로가기
TIL&WIL

241209 TIL - 알고리즘 트러블슈팅(sort와 forEach 관련)

by 나노다 2024. 12. 9.

알고리즘 트러블슈팅

오늘은 알고리즘 문제를 풀며 마주했던 오류와 이 넘을 해결했던 과정을 간단히 정리해보자!

문제의 코드!!

 

이 함수는 두 숫자로 이루어진 배열들을 요소로 갖는 배열을 매개변수로 받는다!

두 숫자로 이루어진 배열을 아들배열, 얘네를 가진 배열을 엄마배열이라 해보자!

아들배열의 두 숫자는 직사각형의 너비와 높이고, 우리는 아들배열들의 너비와 높이들을 비교해

각각의 최댓값의 곱을 구해야한다! 근데 직사각형을 돌릴 수가 있어서, 너비와 높이가 변할 수 있음!

 

그래서 우선 아들 녀석들을 모두 sort() 메서드를 통해 정렬해주고, 

왼쪽 아들, 즉 0번째 인덱스 값을 widths란 배열에, 오른쪽 아들 1번째 인덱스 값을 heights 배열에 넣어줬다!

그리고 각 배열에서 최댓값을 찾고, 두 녀석을 곱해서 해피 엔딩이 될 줄 알았고,

테스트도 모두 통과했는데, 정답 제출에서 반타작이 난 것이였던 게 오늘의 문제 상황이었다!

 

 사진에서 보다시피, 어제 배운 디버깅 요령을 활용해 테스트를 해봤는데, 정말 슬프게도 의도한대로 잘 작동하고 있었다...

그래서 얘는 안 되겠고, 반례를 찾기 위해 질문 탭을 열람해보았다!

그렇게 나와 비슷한 번호들을 틀린 몇 사람들의 반례를 가져와 테스트해보았으나, 역시 잘 작동했다 ㅠㅠ

 

결국 팀원분들께 SOS, 의외로 간단히 해결됐는데, 원인은 바로 sort() 메서드에 있었다!

sort()에 콜백함수를 주지 않으면, 각 요소를 문자열로 변환하고,

변환된 각 문자의 유니코드 코드 포인트 값에 따라 정렬되게 된다! 

즉, 나는 숫자 비교를 하고싶은디, 이 녀석이 내 소중한 아들래미들을 문자로 바꿔 보고 있었던 것이다!

반례 발견!!!

 

사진에서 잘리긴 했는디, 한 아들래미가 [50, 1]이다. 그리고 내 의도대로라면 이 녀석을 sort()했을 때,

작은 녀석이 앞으로 와야하니 [1, 50]이 돼야할 텐디, 4번에 보면 [50,1]의 결과물이 나온 걸 볼 수 있다!!

이처럼, 문자 이외의 값을 정렬하고자 할 땐, 콜백함수를 꼭 넣어줘야 원하는 결과를 얻을 수 있는 것이다!!

정답 코드!!

 

 

추가로 알게 된 점

forEach는 비동기를 기다려주지 않는단다. filter도 그랬는데 못 된 녀석들이다!