[Programmers] #181897 - 리스트 자르기 [Java][C++][Python]
n 값에 따라 리스트를 네 가지 규칙 중 하나로 잘라 부분 리스트를 반환하는 워밍업 문제.
[Programmers] #181897 - 리스트 자르기 [Java][C++][Python]
1. 아이디어
slicer의 세 값을 각각 a, b, c로 두고 n 값에 따라 분기한다. n이 1이면 처음부터 인덱스 b까지, 2면 인덱스 a부터 끝까지, 3이면 인덱스 a부터 b까지를 자른다. 이 셋은 모두 양 끝을 포함하는 구간이므로 상한 인덱스에 1을 더해 반열린 구간으로 바꿔 넘긴다. n이 4이면 인덱스 a부터 b까지 c 간격으로 값을 뽑는다.
2. 복잡도
| 접근 | 시간 | 공간 |
|---|---|---|
| 풀이 | $O(N)$ | $O(N)$ |
($N$ = num_list의 길이)
3. 코드
풀이 [Java][C++][Python]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.*;
class Solution {
public int[] solution(int n, int[] slicer, int[] num_list) {
int a = slicer[0], b = slicer[1], c = slicer[2];
if (n == 1) return Arrays.copyOfRange(num_list, 0, b + 1);
if (n == 2) return Arrays.copyOfRange(num_list, a, num_list.length);
if (n == 3) return Arrays.copyOfRange(num_list, a, b + 1);
List<Integer> list = new ArrayList<>();
for (int i = a; i <= b; i += c) {
list.add(num_list[i]);
}
return list.stream().mapToInt(Integer::intValue).toArray();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <bits/stdc++.h>
using namespace std;
vector<int> solution(int n, vector<int> slicer, vector<int> num_list) {
int a = slicer[0], b = slicer[1], c = slicer[2];
if (n == 1) return vector<int>(num_list.begin(), num_list.begin() + b + 1);
if (n == 2) return vector<int>(num_list.begin() + a, num_list.end());
if (n == 3) return vector<int>(num_list.begin() + a, num_list.begin() + b + 1);
vector<int> v;
for (int i = a; i <= b; i += c) {
v.push_back(num_list[i]);
}
return v;
}
1
2
3
4
5
6
7
8
9
10
def solution(n, slicer, num_list):
a, b, c = slicer
if n == 1:
return num_list[: b + 1]
if n == 2:
return num_list[a:]
if n == 3:
return num_list[a : b + 1]
return num_list[a : b + 1 : c]
This post is licensed under CC BY 4.0 by the author.