
주어진 숫자 배열에서, 0을 배열의 마지막쪽으로 이동시켜주세요. 원래 있던 숫자의 순서는 바꾸지 말아주세요.
(새로운 배열을 생성해서는 안 됩니다.)
Input: [0,1,0,3,12]
Output: [1,3,12,0,0]
const moveZeroes = nums => {
for (let i=nums.length-1; i>=0; i--) {
if (nums[i] === 0 ) {
nums.push(nums[i]);
nums.splice(i, 1);
}
}
return nums;
}
splice()메서드는 배열의 기존 요소를 삭제 또는 교체하거나 새 요소를 추가하여 배열의 내용을 변경합니다.
array.splice(start[,deleteCount[, item1[, item2[, ...]]]])
start는 배열의 변경을 시작할 인덱스
deleteCount는 배열에서 제거할 요소의 수
item1,item2,...는 배열에서 추가할 요소

👉 처음에는 fot(let i=0; i<nums.length; i++)로 앞에서부터 0이 나오면 제일 뒤에 0을 넣어주는 push를 써주고 앞에 0부분을 지워주는 splice를 써줬다. 하지만 그렇게되면 앞에 0이 사라져서 다음 0인지 아닌지 계산해야하는 값이 index=0이 되어서 결국 우리는 다음 값인 index=1을 계산해버리게된다.
이를 방지하기 위해서 뒤에서부터 계산해주면 0이 추가되어도 결국 다음값인 앞에 값을 계산하게 되어서 의도한 바가 된다
예를 들어서 위의 예시에서 보면 처음 계산을 하면 0이 맨뒤로 가고 없어지므로 [1,0,3,12,0]이 되는데
앞에서부터 계산을 해주면 다음 1을 살펴봐야하는데 1이 아닌 0을 살펴보게된다. 하지만 거꾸로 계산해주면 0이 생겨도 그 다음값인 12가 0인지 아닌지 비교할 수 있기때문에 for (let i=nums.length-1; i>=0; i--)를 써줘야한다.
배열을 처음부터 훑어서 가작 작은 수를 제일 앞에 가져다 놓는다. 그 다음, 다시 배열을 훑어서 두 번째로 작은 수를 두 번째 칸에 가져다 놓는다. 계속 반복해서 끝까지 정렬합니다.
const selectionSort = (nums) => {
for(let i=0; i<nums.length-1; i++){
let min = i;
for(let j=i+1; j<nums.length; j++){
if(nums[min]>nums[j]){
min = j;
}
}
if(min!==i){
[nums[i],nums[min]]=[nums[min],nums[i]];
}
}
return nums;
}
👉 ES6 문법 중에서 구조 분해 할당 구문은 배열이나 객체의 속성을 해체하여 그 값을 개별 변수에 담을 수 있게 하는 JavaScript 표현식이다.
구조분해할당 중에서 변수 값 변환하기를 통해서 문제를 풀었다.
하나의 구조 분해 표현식만으로 두 변수의 값을 교환할 수 있습니다.구조 분해 할당 없이 두 값을 교환하려면 임시 변수가 필요하다.
위의 예시에서도 구조분해할당 없이 코드를 짜려면 temp를 사용해서 값을 저장하고 바꿔줘야하는 더 긴 코드가 나오게된다.
구조분해할당 예시

다시 위의 문제로 넘어가면
for문을 통해서 min에 index i인 수를 놓고 다음 수 인 index j인 수가 그것보다 작으면 index j위치의 수를 min으로 놓게한다.
그리고 i가 min이 아닌 경우에는 지금 index가 min인 위치의 수를 가장 앞으로 가져오도록 위치를 바꿔준다.
🤔 분명 학교다닐 때랑 정처기 준비하면서 공부했었던 선택정렬인데 다시 문제를 푸려니 막혔었다. 한 번 배웠던 문제라고 넘기지 말고 다시 풀어봐야겠다고 반성하게되는 문제였다.