220823 TIL 테스트 코드 먼저 작성하자

오늘은 자바스크립트로 코딩도장 풀면서 알게 된 sort 때문에 애를 먹었다.

 

문제는 프로그래머스의 K번째수로 주어진 배열을 슬라이싱 후 그 배열을 정렬한 후 답을 도출해내는 과정이 필요했다.  

정렬은 당연히 sort로 한 다음에 그 배열에서 인덱스 번호로 답을 찾으면 될 줄 알았는데 자꾸 2번 케이스에서 실패가 돼서 문제가 풀리지 않았다.

 

답을 구하는 과정에서 슬라이싱이 잘못되었나? 아니면 정렬된 배열에서 답을 가져오는 과정이 잘못되었나?? 생각을 했는데

테스트 코드를 작성한게 전부 통과돼서 당연히 문제도 풀릴 줄 알았는데 풀리지 않아서 당황했다.

 

뭐가 문제인지 한참을 고민하다 sort에 대한 테스트 코드가 빠진 것을 확인하고 sort가 잘못되었나 생각을 했다.

그래서 자바스크립트 sort에 대해 검색을 했는데 내가 생각한 대로 정렬이 되지 않고 있다는 것을 확인할 수 있었다.

 

sort()로 오름차순하기

const array = [3, 2, 11, 1, 5]; 
array.sort();  // 나의 예상 정렬 결과 [1, 2, 3, 5, 11]

// 실제 정렬 결과 [1, 11, 2, 3, 5]

예를 들어 [3, 2, 11, 1, 5] 이 배열을 sort()로 정렬하면 나의 예상 값은 오름차순으로 정렬된 [1, 2, 3, 5, 11]인데 [1, 11, 2, 3, 5]로 정렬되는 것을 확인할 수 있다.

숫자 배열에 sort()를 사용하면 숫자를 비교해서 정렬하는 게 아니라 숫자를 문자열로 변환한 다음에 정렬을 한다.

그래서 11이 2 보다 작기 때문에 [1, 11, 2, 3, 5] 이 순으로 정렬이 되는 것을 알 수 있다.

 

그래서 내가 원하는 숫자 값을 그대로 정렬하는 방법은 sort() 메서드의 비교 함수를 사용해야 했다.

array.sort((a,b) => a - b);  // [1, 2, 3, 5, 11]

여기서 a, b를 인자로 입력받아 a값이 더 크면 a - b 값이 양수가 돼서 b가 a보다 앞에 오도록 정렬하고 작으면 a가 b보다 앞에 오도록 정렬한다.

 

만일 내림차순을 하고 싶으면 a - b를 b - a로 바꾸면 된다.

arr.sort((a, b) => b-a)

 

테스트 코드부터

결국 테스트 코드를 전부 작성하지 않아서 발생한 문제였다.

sort정도는 당연히 내가 생각한 대로 정렬되겠지 하고 작성했었는데 sort가 잘못되었었다..

만약에 sort 하는 과정도 테스트 코드를 작성해서 문제를 풀었다면 금방 풀 문제를 삥삥 돌아서 풀었다.

 

지금까지 테스트 코드를 작은 단위까지 작성하라고 배웠는데.. 나는 당연하다고 생각한 과정은 무의식적으로 스킵했던 것 같다.

테스트 코드를 의식적으로 작은 단위까지 모두 작성하려고 노력해보자.

제발 테스트 코드 먼저 작성 하자!!!!!