문제 설명
정수 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 함수를 완성해주세요.
🙋♀️ 내 생각
배열을 어디부터 어디까지 자를것인지를 silcer의 요소들을 num_list의 인덱스로 이용해서 자르는 문제이다.
문제는 n의 값이 어떤 값이 들어오는지에 따라서 자르는 인덱스의 값이 달라진다.
특히 n=4일경우에는 c간격으로 잘라야하기때문에 조건이 하나 더 추가돼서 유의해야 할 것같다고 생각했다.
n의 값이 4가지 경우이고, 어떤 값이 들어가는지에 따라서 slice해줘야하는 인덱스가 달라지기때문에 이러한 경우들을 나눠서 처리해야했다. 그래서 if문을 이용해서 문제를 풀었는데, 다 풀고 보니 switch문을 이용하여 case를 나눠서 적는 것이 더 좋았을 것같다.
이렇게 case를 나누는 경우에는 switch문을 이용하는 것을 잊어버리지 말아야겠다!!
✅ 내 코드
function solution(n, slicer, num_list) {
if(n===1){
num_list = num_list.slice(0,slicer[1]+1)
}
if(n===2){
num_list = num_list.slice(slicer[0])
}
if(n===3){
num_list = num_list.slice(slicer[0],slicer[1]+1)
}
if(n===4){
num_list = num_list.slice(slicer[0],slicer[1]+1).filter((_,i)=>i%slicer[2]===0)
}
return num_list
}
우선, 제일 처음으로는 if문을 이용해서 n===1, n===2, n===3, n===4인 경우로 경우를 모두 나눠주었다.
그런 다음 num_list의 인덱스를 자르기 위해서 slice()를 사용했다. slice()는 begin, end 인덱스를 인자로 받아서 그만큼만 잘라낸다.
end인덱스는 미포함하는 특징을 가지고 있기때문에 end인덱스+1을 해주어야 end인덱스를 포함하여 자를 수 있다.
n===1인 경우를 보면, num_list.slice(0,slicer[1]+1) 을 통해서 num_list의 0번 인덱스부터 b번 인덱스(slicer[1]+1)까지를 자른다.
slice()는 새로운 값을 반환하기 때문에 num_list에 값을 담아서 새롭게 변경된 값을 다시 재할당해준다.
n===2, n===3의 경우도 n===1의 경우와 비슷하게 slice()를 이용해서 인덱스만 바꿔서 풀면 된다.
n===4의 경우에만 c간격으로라는 경우가 추가되었기 때문에, 식을 더 추가해준다.
일단 slice()는 위와 동일한 방법으로 한다. slice()를 통해서 begin과 end인덱스를 지정하고 배열을 자르고 필요한 값만 filter()를 통해서 남긴다.
간격으로 쓰이는 값은 c로 slicer의 2번째 인덱스를 의미한다. 이것을 식으로 표시하면 slicer[2]이다. filter를 이용해서 인덱스의 간격을 지정한다. i를 c로 나눠서 나머지가 0인 값들만 남기면 c간격의 인덱스값을 가지고 있는것만 남는다.
그런 다음 num_list를 통해서 리턴한다.
💻 다른사람 코드중에 배울 것
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));
}
}
switch문을 통해서 푼 코드이다.
slicer의 인덱스를 이용하는 것이나, n===4인 경우 filter()를 통해서 간격을 지정하는 것도 동일하다. 전반적인 푸는 방법은 동일하지만 나는 if문을 사용한것과 달리 switch문을 사용했다.
let [a, b, c] = [...slicer];
우선, 배열의 구조분해할당을 이용하여 slicer의 각각의 요소들을 a,b,c라는 변수에 할당한다.
(나는 이 과정을 하지않았지만 이렇게 만들면 코드의 가독성이 올라갈수 있어서 좋을것같다)
그런 다음, switch문을 사용해서 case를 나눴다.
그리고 각각의 case에 맞게 num_list를 자르는 과정을 진행한다.
(이 과정자체는 if문을 사용한 내 코드와 동일하다)
🙋♀️ 내 생각
slice()가 익숙하면 풀기 어렵지는 않은 문제였다. 그래도 case가 여러개인 경우인데 switch문을 생각하지 못한게 아쉽다.
배열의 구조분해할당도 코드의 가독성을 위해서 잘 이용하면 좋을 것 같다.
구조분해할당은 실제 프로젝트할때도 가독성을 위해서 자주 사용하기때문에 이렇게 알고리즘을 풀때도 가독성을 신경쓰면서 코드를 짤 수 있도록 평소에 연습하도록 해야겠다.
'JavaScript > 알고리즘' 카테고리의 다른 글
프로그래머스 주사위의 개수 JS (0) | 2023.06.30 |
---|---|
프로그래머스 빈 배열에 추가 삭제하기 JS ( Array(), fill() / forEach안에서 범위나누기 ) (0) | 2023.06.29 |
프로그래머스 세번째 구분자 JS ( match()는 split()과 유사하다 / || 연산자 ) (0) | 2023.06.26 |
프로그래머스 글자지우기 JS ( for...of 반복가능한 객체를 간편하게 순회 ) (0) | 2023.06.25 |
프로그래머스 문자열이 몇 번 등장하는지 세기 JS ( indexOf() 특징 ) (0) | 2023.06.24 |