제일 작은 수 제거하기




프로그래머스 ‘제일 작은 수 제거하기’ 문제.

배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하기



나의 해결방안

case1

function solution(arr) {
    var answer = [];
    let min = 0;
    if(arr.length === 1){
        answer.push(-1);
    }else{
        arr.splice(arr.indexOf(Math.min(...arr)),1)
        answer = arr;
    }
    return answer;
}

사실 위 코드는 아래의 코드로 바꿔 쓸 수 있다.

arr.splice(arr.indexOf(Math.min(...arr)),1)
return arr.length !== 0 ? arr : [-1]





case 2

function solution(arr) {
    let min = arr[0];   //min이니까 초기값을 배열의 가장 첫째값으로 지정해줌
    for(let i = 1; i<arr.length; i++){  //i=1로 두번째 인자부터 검사하도록
        if(min > arr[i]){	//만약 최소값이 새로들어오는 값보다 크다면
            console.log(min, arr[i])
            min = arr[i];	//
        }
    }
    
    for(let i = 0; i<arr.length; i++){
        console.log(arr[i])
        if(arr[i] !== min){
            arr.push(arr[i])
        }
    }
    
    return arr.length !== 0 ? arr : [-1];
}
solution([4,3,2,1])

최댓값 구하는건 명확하게 머리에 박혀있는데

최솟값구하는건 바꿔서 생각을 못했다.

최댓값은 가장 큰 수가 들어올 가능성이 있기때문에 시작을 0으로 하지만

최솟값은 배열의 첫번째 값으로 지정해줘야한다.



if(min > arr[i]){ //만약 최소값이 새로들어오는 값보다 크다면 처음에는 이게 뭔말인가 했는데

runjs에 돌려보니까 이해가 갔다. 만약 [4,3,2,1] 이라는 배열이 들어오게 되면min 과 arr[i]이

4 3 3 2 2 1

이렇게 찍히게 되는데 그렇게 되면 새로운 값이 들어올때마다 작은값이 Min으로 들어오게 된다.

만약 거꾸로 [1,2,3,4] 라는 배열이 있다면 초기값이 1이므로

1 2 1 3 1 4

이렇게 찍힐거고 그러면 min은 1로 계속해서 바뀌지 않을것임

이러나 저러나 초기값을 구할 수 있음.



위의 for문에서 min값을 가지고 왔다면

아래의 for문은 배열안의 각각의 값을 min값과 비교해서 만약 min값이 arr[i] 과 같지 않다면 새로운 배열에 넣어주도록 하는 로직이다.

그리고 마지막 return은 배열길이가 0일때(=배열 안에 아무것도 없을때) -1을 리턴하고 아니라면 정답배열을 반환한다는 삼항연산자를 사용했다





case 3

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

사실 이 방법이 제일 깔끔하다

스프레드 연산자와 Math.min을 사용해서 배열안의 최소값을 구한다

(다음에 최소값 구할일이 있으면 이렇게 구해야지)

그리고 filter를 이용해서 arr의 각 값(=num)이 min과 같지 않다면,

answer라는 빈 배열로 리턴해준다

그리고 이 함수의 return 값은 만약 배열의 길이가 0이라면(=빈배열이라면) -1을, 0이 아니면 새롭게 리턴된 배열(=answer배열)을 리턴



이번 문제는 최소값을 구하는 문제였다.

for문으로 최소값을 구하는 가장 포인트는 배열의 가장 첫번째 값을 초기값으로 정해주는거다.

스프레드 연산자로 최소값을 구하는 포인트는 Math.min 을 사용해서 정말 초 간단하게 구할 수 있었다




© 2018. by sora

Powered by sora