우테코: 최종 코딩테스트 준비 TIL

어쩌다 보니 2024년에 처음 쓰는 글이.. 한참..(대략 한달정도) 지난 우테코 최종 코딩테스트를 준비하면서 알게된 새로운 것들을 정리하는 글이다.

연말 + 연초 버프로 매우 느슨해진 상태로.. 해당 글을 작성하는 걸 거의 한달정도…? 미룬 것 같다. 그래서 이제 다시 마음을 다 잡고자! 미루고 미뤘던 블로그 글을 다시 작성해보고자 한다.

새롭게 배운 것

5시간의 시간 제한을 두고 문제를 풀면서 새롭게 알게된 개념이 존재했다. 1,2주차는 Class도 잘 모르고 Test도 잘 모를때라.. 약간 뚱땅뚱땅 돌아가는 쓰레기 코드를 작성했는데, 이번에 최종 코딩테스트를 준비하면서 해당 문제를 성장한 현 상태에서 다시 풀다보니 기존에 풀던 방식과 다르게 생각하여 새롭게 알게된 개념이 존재했다.

숫자 배열 정렬

Lotto 문제를 재풀이하면서, 숫자가 담긴 배열을 오름차순으로 정렬해야 하는 경우가 발생했다.
이때, sort()를 통해서 배열을 정렬하고자 했다. 그래서 해당 배열에 바로 sort()를 적용하였으나 정렬되지 않았다.

// 처음에 작성했던 코드
lotto.push(ticket.sort());

그래서 도대체..? 왜 정렬이 되지 않을까? 아무리 봐도 이상한 코드는 존재하지 않았다.
그래서 역시나 오늘도 등장하는 나의 친구 ChatGPT에게 해당 코드를 던지고 정렬이 되지 않는 이유를 물어봤다.

결론은, js에서 숫자를 배열할 때는 그냥 sort()만 작성해서는 안된다는 것이었다..

js에서 숫자 배열을 정렬할때는 sort((a,b)=>a-b)로 작성해야 한다.
단순하게 sort()는 문자열을 정렬할 때만 적용이 된다..

// 수정한 코드
lotto.push(ticket.sort((a, b) => a - b));

정렬 전 결과
정렬 전 결과

정렬 후 결과
정렬 후 결과

왜 이런 문제가 생기는 것일까?

js에서 sort()는 정렬하기 전에 배열 내부 값은 문자열로 변경하여 정렬을 하기 때문이다. 그렇기 때문에 1이 아니라 ‘1’로 변경해서 정렬을 한다. 숫자를 문자열로 변경하여 정렬을 진행하면 가장 첫번째 숫자(문자)의 크기로 정렬을 진행한다.

예를 들어, [1,200,3,100]의 배열이 존재하고 여기에 sort()함수를 적용하면 결과는 [1,100,200,3]으로 정렬된다.

그렇기 때문에 우리가 숫자 배열을 정렬할때는 꼭! 위에서 설명한 방식으로 정렬을 해야 한다.

sort((a,b)=>a-b)는 무슨 의미일까?

(a,b)는 인자로, 정렬 기준을 나타내는 콜백함수이다. a와 b로 다음과 같은 규칙을 통해 숫자 배열을 정렬한다.

a - b를 진행한다. 이때,

  • a가 b보다 작으면 음수(-) 반환
  • a가 b보다 크면 양수(+) 반환
  • a가 b와 같으면 0을 반환

예를 들어보자! [1,10,5]의 배열이 존재한다.

  • 1 - 10 = -9 => 음수이므로 그대로
  • 10 - 5 = 5 => 양수이므로 둘이 순서 바꿈 [1,5,10]
  • 5 - 10 = -5 => 음수이므로 그대로

나는 위와 같이 이해했다.
즉, 버블 정렬의 방식으로 숫자 배열 정렬한다! 라고 이해하니 한번에 이해가 됐다.

🔥 console에 직접 찍어본 결과 첫 a는 1, b는 10이 아니라 a는 10, b는 1이 된다!
근데, 똑같이 버블정렬로 이해하면 되는 것 같다. 단지 결과가 양수일 때 순서를 바꿀 것인지, 음수일 때 순서를 바꿀 것인지 정도의 차이가 생긴다.

오류 수정

자동차 경주를 다시 문제 풀이 하면서 발견한.. 엄청나게 중요하고 절대 하면 안되는 실수를 저질렀다..ㅎ

그건 바로.. 함수를 사용할 때 결과값을 반환하지 않는 것…!!!

문제의 코드
문제의 코드

위 코드에서 뭐가 문제인지 알겠는가…?ㅎ..

return이 존재하지 않아서 반환값이 없어서 문제가 생겼다.
이런.. 멍청한.. 실수를 저질렀다.. 정말.. 왜 값이 안나오지? 이러고 엄청나게 삽질을 했는데, 연습을 하다가 자주 나올 것 같은 실수를 발견해서 정말 다행이었다.

수정한 코드
해결 코드

뭐가 문제인지를 찾아준 이번에도 한건 해주시는 ChatGPT…

ChatGPT 답변

해당 실수는 생각보다 자주 나올 수 있다고 생각한다.
실제로 예전에도 이런 실수를 한번 저질렀었는데.. 이번에 또.. 해버렸다ㅜ.. 시간이 좀 지났다고 그새 까먹었냐..후..

마무리

드디어 우테코 프리코스 + 최종 코딩테스트에 관한 모든 글을 작성했다. 앞으로 우테코 관련 항목은 우아한 테크 코스를 진행하면서 새롭게 배운 점들이 올라올 것 같은데.. 열심히 블로그를 작성해야겠다..!

참고자료
자바스크립트 배열 정렬: sort()와 toSorted() 함수
자바스크립트 문자열 & 숫자 정렬하기

Comments