제일 작은 수 제거하기
in Algorithm
프로그래머스 ‘제일 작은 수 제거하기’ 문제.
배열, 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
을 사용해서 정말 초 간단하게 구할 수 있었다