Post

[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.