프로그래머스 알고리즘 풀이
사용 언어 - 자바스크립트 JavaScript JS
1. 리스트 자르기
1) ❓ 문제 설명
정수 n과 정수 3개가 담긴 리스트 slicer 그리고 정수 여러 개가 담긴 리스트 num_list가 주어집니다. slicer에 담긴 정수를 차례대로 a, b, c라고 할 때, n에 따라 다음과 같이 num_list를 슬라이싱 하려고 합니다.
- n = 1 : num_list의 0번 인덱스부터 b번 인덱스까지
- n = 2 : num_list의 a번 인덱스부터 마지막 인덱스까지
- n = 3 : num_list의 a번 인덱스부터 b번 인덱스까지
- n = 4 : num_list의 a번 인덱스부터 b번 인덱스까지 c 간격으로
올바르게 슬라이싱한 리스트를 return하도록 solution 함수를 완성해주세요.
2) 🚫 제한 사항
- n 은 1, 2, 3, 4 중 하나입니다.
- slicer의 길이 = 3
- slicer에 담긴 정수를 차례대로 a, b, c라고 할 때
- 0 ≤ a ≤ b ≤ num_list의 길이 - 1
- 1 ≤ c ≤ 3
- 5 ≤ num_list의 길이 ≤ 30
- 0 ≤ num_list의 원소 ≤ 100
3) ✅ 입출력 예
n | slicer | num_list | result |
3 | [1, 5, 2] | [1, 2, 3, 4, 5, 6, 7, 8, 9] | [2, 3, 4, 5, 6] |
4 | [1, 5, 2] | [1, 2, 3, 4, 5, 6, 7, 8, 9] | [2, 4, 6] |
2. 사용한 메서드: slice()
Array.prototype.slice()
`slice()` 메서드는 문자열 또는 배열에서 특정 범위의 요소들을 복사하여 새로운 문자열 또는 배열을 반환한다.
// 예제 출처: MDN web docs - Array.prototype.slice()
const animals = ['ant', 'bison', 'camel', 'duck', 'elephant'];
console.log(animals.slice(2));
// Expected output: Array ["camel", "duck", "elephant"]
console.log(animals.slice(2, 4));
// Expected output: Array ["camel", "duck"]
console.log(animals.slice(1, 5));
// Expected output: Array ["bison", "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"]
// 구문
arr.slice([begin[, end]])
1) 매개변수
begin
- 0을 시작으로 하는 추출 시작 요소에 대한 인덱스를 의미
- 음수 인덱스는 배열의 끝에서부터의 길이를 나타냄
- ex) slice(-2)는 배열에서 마지막 두개의 엘리먼트를 추출
end
- 추출을 종료할 0 기준 인덱스
- slice는 end 인덱스를 제외하고 추출한다.
- ex) slice(1, 4)는 두 번째 요소부터 네 번째 요소까지 추출
- end가 생략되면 slice()는 배열의 끝(arr.length)까지 추출
- end값이 배열의 길이보다 크면, slice()는 begin부터 배열의 끝(arr.length)까지 추출
2) 반환 값
- 추출한 요소를 포함한 새로운 배열
- slice()는 원본을 대체하지 않으며, 원본 배열에서 요소의 얕은 복사본을 반환
3. 답안
1) 나의 풀이
const solution = (n, slicer, num_list) => {
let answer = [];
if (n===1) {
answer = num_list.slice(0, slicer[1]+1)
} else if (n===2) {
answer = num_list.slice(slicer[0])
} else if (n===3) {
answer = num_list.slice(slicer[0], slicer[1]+1)
} else {
answer = num_list.slice(slicer[0], slicer[1]+1).filter((_, i) => i%slicer[2]===0)
}
return answer;
}
- 처음엔 slice 대신 splice를 썼는데 에러가 나서 왜지 했는데 splice를 사용하면 원본 num_list 배열이 변경되기 때문에 다음 케이스에서 사용할 수가 없다.
- 얕은 복사를 사용하는 slice 메서드로 풀이를 작성하였더니 쉽게 통과할 수 있었다.
2) 다른 사람의 풀이
function solution(n, slicer, num_list) {
let [a, b, c] = [...slicer];
switch(n) {
case 1:
return num_list.slice(0, b + 1);
case 2:
return num_list.slice(a);
case 3:
return num_list.slice(a, b + 1);
case 4:
return num_list.slice(a, b + 1).filter((_, idx) => !(idx % c));
}
}
- let [a, b, c] = [...slicer] : slicer의 각 요소를 a, b, c 변수에 할당
- !(idx % c) : 나머지가 0이면 false이므로 필터링 되도록
slicer의 요소를 변수로 설정하고, switch문을 사용하여 가독성 면에서 더 좋은 풀이방법인 것 같다.
'💻 Programming > Algorithm' 카테고리의 다른 글
[프로그래머스 Lv. 1] 부족한 금액 계산하기 (0) | 2023.08.16 |
---|---|
[프로그래머스 Lv. 0] 특수문자 출력하기 (0) | 2023.08.13 |
[프로그래머스 Lv. 0] 짝수는 싫어요 (0) | 2023.08.03 |
[프로그래머스 Lv. 0] 369게임 (0) | 2023.08.02 |
[프로그래머스 Lv. 1] 콜라츠 추측 (0) | 2023.08.02 |