https://school.programmers.co.kr/learn/courses/30/lessons/12935
이 문제 덕분에 부족한 개념부분을 더 채울 수 있었다.
나의 코드
풀이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
풀이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가 있었지.....
'알고리즘 > 프로그래머스 - JS' 카테고리의 다른 글
[프로그래머스-JS] level 1. 핸드폰 번호 가리기 <*> <공사중> (0) | 2022.08.05 |
---|---|
[프로그래머스-JS] level 1. 콜라츠 추측 (0) | 2022.08.05 |
[프로그래머스-JS] level.1 최대공약수와 최소공배수 <*> (0) | 2022.08.04 |
[프로그래머스-JS] level.1 정수 제곱근 판별 < (0) | 2022.08.04 |
[프로그래머스-JS] level.1 자연수 뒤집어 배열로 만들기 (0) | 2022.08.04 |