알고리즘/프로그래머스
[프로그래머스] Day12 리스트 자르기
보름달빵
2024. 10. 1. 14:32
✅ 문제
✅ 풀이
문제를 보았을때 배열을 조건에 맞는 범위 만큼 자르는 문제였기 때문에 투 포인터를 사용하여 범위만 지정해주고 마지막에 해당 범위의 값들만 출력해주면 되겠다고 생각했다.
class Solution {
public int[] solution(int n, int[] slicer, int[] num_list) {
int start=0; // 시작 인덱스
int end=num_list.length-1; // 끝 인덱스
int plus=1; // 증가량
switch(n){
case 1:
end= slicer[1];
break;
case 2:
start=slicer[0];
break;
case 3:
start=slicer[0];
end=slicer[1];
break;
case 4:
start=slicer[0];
end=slicer[1];
plus=slicer[2];
break;
}
// 배열의 크기 계산
int size = (end - start) / plus + 1;
int[] answer = new int[size];
// 슬라이싱한 요소들을 answer에 복사
int idx = 0; // answer 배열의 인덱스
for(int i = start; i <= end; i += plus) {
answer[idx++] = num_list[i];
}
return answer;
}
}
문제의 풀이를 생각해내는 과정은 어렵지 않았으나, answer 배열의 크기를 정하는 부분에서 고민을 했어야하는 문제 같다.
🍄 answer 배열의 크기를 구하는 방법
answer 배열이 단순히 start~end까지 1씩 증가했다면 배열의 크기는 (end-start) +1 이 되었을것이다. 하지만 증가량이 1이 아닌 N(임의의 자연수)라면 어떨까?
예를들어 n=2 라고 해보자. n=2일때 선택되는 배열의 개수는 (전체배열의 길이) / n 이다. 2씩 증가한다는 것은 결국 n으로 나눈 몫을 구하는 값과 같다. 하지만 여기서 생각해야할것이 1을 추가하지 않으면 start를 포함하지 않고 start에서 end까지 이동하는 데 걸리는 '단계' 수만 계산하게 된다.
따라서 (end-start)/plus +1 이 answer 배열의 사이즈가 된다.
🍀 참고
class Solution {
public int[] solution(int n, int[] slicer, int[] num_list) {
int start = n == 1 ? 0 : slicer[0];
int end = n == 2 ? num_list.length - 1 : slicer[1];
int step = n == 4 ? slicer[2] : 1;
int[] answer = new int[(end - start + step) / step];
for (int i = start, j = 0; i <= end; i += step) {
answer[j++] = num_list[i];
}
return answer;
}
}
나의 경우는 n에 따라 구분하기 위해 switch-case 를 사용했지만 삼항 연산자를 이용해 푸는 풀이도 있다.