알고리즘/프로그래머스 - JS

[프로그래머스-JS] level.1 제일 작은 수 제거 <**>

개발자성장기 2022. 8. 4. 18:09
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/12935

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

이 문제 덕분에 부족한 개념부분을 더 채울 수 있었다. 

 

나의 코드 

풀이1)

function solution(arr) {
    let newArr = arr.slice();
    newArr.sort((a,b) => b-a);
    const cut = arr.indexOf(newArr[newArr.length - 1]);
    return arr.length == 1 ? [-1] : [...arr.slice(0,cut), ...arr.slice(cut + 1, arr.length)]
}

여기서 시간이 좀 걸린 이유는 

예제만보고 정렬된 배열을 출력하는 줄 알았는데 

질문하기 게시판을 둘러보니까 아니였다. 

 

예를들어 [5, 1, 2, 6, 8] 이 입력으로 들어올 경우  출력으로 [5, 2, 6, 8]을 내보내야한다. 

즉 원 배열에서 제일 작은 숫자만 제거하고 다시 출력해줘야한다. 

 

 

풀면서 놓쳤던 점들 

 

1) 2개 이상의 배열을 합치는 방법 

[...arr.slice(0,cut), ...arr.slice(cut + 1, arr.length)]
arr.slice(0,cut) + arr.slice(cut + 1, arr.length)

이 두가지의 결과는 완전 다르다. 

[3] + [1,2] 의 결과는 어떠할까 ? 

 

먼저 이것부터 이해하자 

const arr = [1,2,3,4,5,6,7]

console.log(arr.slice(0,4)) //[ 1, 2, 3, 4 ]

원래는 슬라이스를 하면 배열을 반환한다. 

그런데 슬라이스를 각각 따로한뒤 + 연산자를 사용하면 어떻게될까 ?

 

const arr = [1,2,3,4,5,6,7]

console.log(arr.slice(0,4) + arr.slice(4,7))
// 1,2,3,45,6,7

console.log(typeof(arr.slice(0,4) + arr.slice(4,7)))
//string

이렇게 이상하게 결합이되고  타입도 string으로 변한다. 

즉 "1,2,3,45,6,7" 이렇게 되는 것이다. 

 

더 쉽게 이해자면 

const arr1 = [1,2,3,4];
const arr2 = [5,6,7,8];

console.log(arr1 + arr2) //1,2,3,45,6,7,8

배열은 object라서  object + object는 더하기  연산자가 연결로 작동한다.

그리고 연결하는 순간 전체가 string으로 변한다. 

더하기 연산자
Number + Number  덧셈
Boolean + Number 덧셈
Boolean + Boolean 덧셈
Number + String 연결
String + Boolean 연결
String + String 연결
Object + Object 연결

 

 

2) 배열 복제  

 얕은 복사 깊은 복사 

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

이렇게 하면 newArr로 복제되어  newArr만 정렬될줄 알았는데 arr도 같이 정렬이 되었다

그래서 

let newArr = arr.slice();

이렇게 해줬더니 newArr만 수정되었다. 

 

이 두 부분을 다시 공부하자 

 

그 이유는 let newArr = arr만 되면 참조값만 하나가 더 생기는 것이다. 

즉 두 개의 식별자가 하나의 객체를 공유하는 것이다. 

하지만 let newArr = arr.slice()는  원본을 변형시키지 않는 복사이다. 

 

https://html-jc.tistory.com/373

 

[JS - 개념]  여러 배열 합치는 방법

1. concat() Array.prototype.concat() concat() 메서드는 인자로 주어진 배열이나 값들을 기존 배열에 합쳐서 새 배열을 반환합니다.  - 기존 배열을 변경하지 않는다.  - 추가된 새로운 배열을 반환한다. co

html-jc.tistory.com

 

 

풀이2)

function solution(arr) {
    const cut = arr.indexOf(Math.min(...arr));
    return arr.length == 1 ? [-1] : [...arr.slice(0,cut), ...arr.slice(cut + 1, arr.length)]
}

Math.min(arr)이렇게 하면 안된다  꼭 ...arr 이렇게 풀어서 넣어줘야한다. 

 

다른 사람 풀이 

function solution(arr) {
    arr.splice(arr.indexOf(Math.min(...arr)),1);
    if(arr.length<1)return[-1];
    return arr;
}

 

이거보고 알았다.

 

아 맞다 splice가 있었지..... 

 

반응형