매일 매일 하루 한 문제씩.
꾸준히 이어가는 코딩테스트 풀이 기록 ✅
문제 난이도는 easy인데 왜 이렇게 매번 시간이 오래 걸리는지 정말 ㅠㅠ 어떻게든 1시간 30분 안에 끝내려고 하는데 긴장을 하고 푸는데도 잘 안된다.
오늘의 경우 애초부터 접근이 잘못되었다고 생각하는데...
사전 README 작성을 통해 이 부분을 최대한 낮추려고 하고는 있지만 영 쉽지 않다.
어쨌든. map으로 삽질하던 중 '어? 이게 아니라 배열을 잘라서 합쳐야겠네?' 라는 생각이 들었고 그래서 또 헷갈리는 slice, splice, concat이 등장. 오늘은 TIL로 배열 자르고 합치는 메서드를 간략하게 정리하고자 한다.
와. 자바는 풀다가 GG. 오랜만에 자바 건드리니까 되던것도 안되는듯. 사람은 망각의 동물이고나.
가드클로즈를 2개 만들고 시작했다.
코드가 너무 길어지는 것 아닌가? 라는 생각도 했는데...
그리고 갠적으론 지금 코드에서 가드클로즈 1, 2번의 순서를 바구는게 어떤가? 싶기도 하다. length를 구해주는 게 set을 만드는 것보다는 더 효율적이고 빠를 것 같아서 이를 앞으로 이동해주면 약간의 효율성을 높일 수 있지 않을까? 하는 생각.
function solution(A, K) {
// Implement your solution here
// 1. 가드클로즈. 배열이 하나의 원소로 이루어진 경우
const set = new Set(A);
if (set.size === 1) {
return A;
}
// 2. 가즈클로즈. 로테이트 횟수와 배열 길이가 같은 경우
if (K === A.length) {
return A;
}
const indexOfFirstItem = A.length - (K % A.length);
const front = A.slice(indexOfFirstItem);
const result = front.concat(A.slice(0, indexOfFirstItem));
return result;
}
splice()
의 중요한 점은 원본 배열을 변형한다는 것!! 예전에 reduce를 원하는 방식대로 사용하기 위해 splice를 몇 번 써보았다. 원본 배열을 변형시켰기 때문에 원하는 결과값을 얻을 수는 있었지만 과연 적절한 방법인지는 항상 의문 ㅎㅎ.splice()
메서드는 배열의 기존 요소를 삭제 또는 교체하거나 새 요소를 추가하여 배열의 내용을 변경한다. 모던자바스크립트 튜토리얼에서는 '맥가이버 칼'이라는 표현을 사용한다.deleteCount
는 제거하고자 하는 요소의 '갯수'를 나타내며 생략 시 index부터의 모든 요소를 제거한다. 당연히 이 count가 0일 경우 어떤 요소도 제거되지 않는다.arr.splice(index[, deleteCount, elem1, ..., elemN])
모던자바스크립트 예시
// 요소 세 개를 지우고 그 자리를 다른 요소 두 개로 교체
let arr = ["I", "study", "JavaScript", "right", "now"];
// 처음(0) 세 개(3)의 요소를 지우고, 이 자리를 다른 요소로 대체합니다.
arr.splice(0, 3, "Let's", "dance");
alert( arr ) // now ["Let's", "dance", "right", "now"]
MDN 예시
// 하나도 제거하지 않고, 2번 인덱스에 "drum"과 "guitar" 추가
var myFish = ['angel', 'clown', 'mandarin', 'sturgeon'];
var removed = myFish.splice(2, 0, 'drum', 'guitar');
// myFish is ["angel", "clown", "drum", "guitar", "mandarin", "sturgeon"]
// removed is [], no elements removed
slice()
메서드는 어떤 배열의 시작부터 끝(끝은 미포함)에 대한 얕은 복사본을 새로운 배열 객체로 반환한다고 한다. 중요한 것은 원본 배열이 바뀌지 않는다는 점arr.slice([start], [end])
arr.slice()
는 인수를 하나도 넘기지 않고 호출하여 arr의 복사본을 만들 수 있습니다.
이런 방식은 기존의 배열을 건드리지 않으면서 배열을 조작해 새로운 배열을 만들고자 할 때 자주 사용됩니다.
let arr = ["t", "e", "s", "t"];
alert( arr.slice(-2) ); // s,t (인덱스가 -2인 요소부터 제일 끝 요소까지를 복사)
const animals = ['ant', 'bison', 'camel', 'duck', 'elephant'];
console.log(animals.slice(2));
// Expected output: Array ["camel", "duck", "elephant"]
console.log(animals.slice(-2));
// Expected output: Array ["duck", "elephant"]
console.log(animals.slice(2, -1));
// Expected output: Array ["camel", "duck"]
console.log(animals.slice());
// Expected output: Array ["ant", "bison", "camel", "duck", "elephant"]
array.concat(arg1, arg2...)
const alpha = ['a', 'b', 'c'];
alpha.concat(1, [2, 3]);
// 결과: ['a', 'b', 'c', 1, 2, 3]
let arr = [1, 2];
let arrayLike = {
0: "something",
length: 1
};
alert( arr.concat(arrayLike) ); // 1,2,[object Object]
문제를 풀다보면 은근히 자주 사용하게 되는데 이제 정리해놨으니 잊지말고 사용하자!