티스토리 뷰

알고리즘 문제를 풀 때. 예를 들어, 제일 작은 수를 제거하는 과정에서 배열의 재정렬을 사용한다면 경계해볼 필요가 있다.

# 문제
정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.

# 입력 예
[4,3,2,1]

# 출력 예
[4,3,2]

# 입력 예2
[10]

# 출력 예2
[-1]

위 문제 풀이 과정에서 가장 작은 수를 구하기 위해 배열을 재정렬하는 방법이 제일 먼저 떠오를 것이다.

 

배열의 재정렬을 풀이로 하자면, arr를 sort로 내림차순으로 정렬한 후에 배열의 맨 뒤 요소를 제거하는 pop() 메소드로 제거한다. 그리고 남겨진 값을 반환하면 예상한 결과와 달리 테스트 과정이 통과되지 않는다.

 

이 경우, filter() 메소드를 사용해서 배열의 가장 작은 값과 같지 않은 값들을 가진 새로운 배열을 반환하는 식으로 해결할 수 있다.

function solution(arr) {
	const removeMinNum = arr.filter(n => n !== Math.min(...arr));
    return removeMinNum.length === 0 ? [-1] : removeMinNum;
}

즉, sort() 메소드를 사용하지 않고 가장 작은 수를 찾아서 제거해야 하는 문제이다. 그 과정에서 배열을 재배열하는 것을 경계해야 하는 이유가 발생하는 것이다.

 

배열을 sort() 메소드로 정렬하는 습관을 들이면 안되는 이유

대다수의 통계 자료는 배열의 형태로 되어 있다. 예를 들어, 12개월의 월 평균 기온의 배열이 있다고 가정한다면.

[2,7,11,15,22,24,28,25,19,10,4,3]

위와 같은 배열이 있을 때, 해당 배열에서 가장 작은 수를 찾으려고 내림차순으로 재배열을 하면 어떤 월의 평균 기온을 구하려고 한다면 어려움을 겪게 될 것이다. 이미 해당 배열은 규칙과 순서에 맞게 졍렬되어 있는 상태이기 때문이다. 다시 다른 기준으로 재정렬(sort)한다면 위의 데이터가 가진 의미가 사라지는 것과 같다.


참조 블로그

https://dev-robinkim-93.tistory.com/15

 

제일 작은 수 제거하기(배열의 재정렬을 경계해야 하는 이유)

# 문제 정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이

dev-robinkim-93.tistory.com