ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 문제 풀이 K번째 수
    레거시/레거시-프로그래머스-코딩 테스트 고득점 kit 2019. 12. 6. 14:02
    반응형

    문제 URL K번째 수

    Contents

    1. 문제 지문 파악하기
    2. 구르미의 알고리즘 풀이

    문제 지문 파악하기

    이번에도, 입력을 통해서 문제를 파악해보도록 하겠습니다. 문제의 입력은 이렇습니다.

     

    입력 :
    array = [1, 5, 2, 6, 3, 7, 4]
    commands = [[2, 5, 3], [4, 4, 1], [1, 7, 3]]

     

    이제 commands에서 하나씩 꺼내서, 시작점, 끝점, 반환할 인덱스를 가져오겠습니다.

     

    command = [2, 5, 3] //commands[0]
    start = 2
    end = 5
    idx = 3

     

    문제에 따르면, 인덱스가 0부터가 아닌 1로 되어 있습니다. 이를 조정해주어야 합니다.

     

    command = [2, 5, 3]
    start = 1 //인덱스 조정
    end = 5
    idx = 2 //인덱스 조정

     

    즉, 인덱스가 0부터 시작하도록 start, idx를 1씩 줄여주어야 합니다. end는 안줄여도 됩니다. 왜냐하면, 보통 언어에서 vector, slice등을 잘라낼 때 start <= x < end 의 범위로 잘라내게 됩니다. 계속 진행해보도록 하죠. 이제 start 부터 end까지 array에서 잘라냅니다.

     

    command = [2, 5, 3]
    start = 1
    end = 5
    idx = 2
    sub = [5, 2, 6, 3] // array[1:5] (1 <= x <5 범위를 자름)

     

    이 sub를 오름차순으로 정렬합니다.

     

    command = [2, 5, 3]
    start = 1
    end = 5
    idx = 2
    sub = [2, 3, 5, 6] //오름차순 정렬

     

    여기서 idx에 해당하는 5를 answer에 넣어주면 됩니다.

     

    command = [2, 5, 3]
    start = 1
    end = 5
    idx = 2
    sub = [2, 3, 5, 6]
    answer = [5] //sub[idx]

     

    이것을 commands를 모두 순회할 때까지 반복하면 됩니다. 다음은 이후 상황에서 벌어질 데이터들의 상황입니다.

     

    두 번째:
    command = [4, 4, 1]
    start = 3
    end = 4
    idx = 0
    sub = [6]
    answer = [5, 6]

    세 번째:
    command = [1, 7, 3]
    start = 0
    end = 7
    idx = 2
    sub = [1, 2, 3, 4, 5, 6, 7]
    answer = [5, 6, 3]

     

    이렇게 해서 만들어진 answer를 반환하면 됩니다. 이 문제에서 따로, 우리가 프로그래밍적으로 생각할 필요는 없습니다. 그냥 풀면 되지요.

    구르미의 알고리즘 풀이

    "문제 지문 파악하기"를 토대로 세운 알고리즘을 순서대로 나열하면 다음과 같습니다.

     

    1. commands를 다음과 같이 순회합니다.
      1. command에서 첫 원소(sub 배열의 시작점)를 start, 두 번째 원소(sub 배열의 끝점)를 end, 세번째 원소(sub 배열의 반환 원소의 위치)를 idx를 꺼내옵니다.
      2. array에서 start-1 부터 end까지 잘라서 배열 sub를 만듭니다.
      3. sub를 정렬합니다.
      4. sub[idx-1]에 해당하는 원소를 answer에 넣습니다.
    2. 이렇게 초기화된 answer를 반환합니다.

    이를 코드로 표현하면 다음과 같습니다. 다음은 PYTHON 코드입니다.

     

    PYTHON 코드

    def solution(array, commands):
        answer = []
        # 1. commands를 순회합니다.
        for command in commands:
            # 1. start, end, idx를 command 에서 꺼내옵니다.
            (start, end, idx) = command
            # 2. array에서 start-1 ~ end 까지 잘라 배열 sub를 만듭니다. 이 sub를 정렬합니다.
            sub = sorted(array[start-1:end])
            # 3. sub[idx-1]을 answer에 반환합니다.
            answer.append(sub[idx-1])
        
        return answer

     

    이번엔 CPP 코드입니다. 알고리즘은 동일하고, 언어만 바뀐 것입니다.

     

    CPP 코드

    #include <string>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    vector<int> solution(vector<int> array, vector<vector<int>> commands) {
        vector<int> answer;
        
        for (const auto & command : commands) {
            auto start = command[0];
            auto end = command[1];
            auto idx = command[2];
            auto sub = vector<int>(array.begin() + start - 1, array.begin() + end);
            sort(sub.begin(), sub.end());
            answer.push_back(sub[idx - 1]);
        }
        
        return answer;
    }

     

    참고적으로 파이썬의 "리스트 컴프리헨션"을 이용하면, 한 줄로 풀 수도 있습니다. 다음은 한 줄로 파이썬 코드입니다.

     

    PYTHON 코드

    def solution(array, commands):
        answer = [ sorted(array[start-1:end])[idx-1] for (start, end, idx) in commands ]
        return answer

     

Designed by Tistory.