코딩테스트/프로그래머스

K 번째 수 C++(정렬)[프로그래머스]

멍토 2019. 11. 20.

※ 저의 풀이가 무조건적인 정답은 아닙니다.

다른 코드가 좀더 효율적이고 좋을 수 있습니다.

다른사람들의 풀이는 언제나 참고만 하시기 바랍니다.

문제 주소입니다.

https://programmers.co.kr/learn/courses/30/lessons/42748

불러오는 중입니다...

 


목차

1. 문제 설명

2. 문제 해석

3. 소스 코드

3.1 주석 없는 코드

3.2 주석 있는 코드

3.3 테스트 코드

4. 결과

 


1. 문제 설명

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.

예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면

  1. array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
  2. 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
  3. 2에서 나온 배열의 3번째 숫자는 5입니다.

 

문제!!

배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때,

commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록

solution 함수를 작성해주세요.

 

제한사항

  • array의 길이는 1 이상 100 이하입니다.
  • array의 각 원소는 1 이상 100 이하입니다.
  • commands의 길이는 1 이상 50 이하입니다.
  • commands의 각 원소는 길이가 3입니다.

 

예시

array commands return
[1, 5, 2, 6, 3, 7, 4] [[2, 5, 3], [4, 4, 1], [1, 7, 3]] [5, 6, 3]

 

[1, 5, 2, 6, 3, 7, 4]를 2번째부터 5번째까지 자른 후 정렬합니다. [2, 3, 5, 6]의 세 번째 숫자는 5입니다.


[1, 5, 2, 6, 3, 7, 4]를 4번째부터 4번째까지 자른 후 정렬합니다. [6]의 첫 번째 숫자는 6입니다.


[1, 5, 2, 6, 3, 7, 4]를 1번째부터 7번째까지 자릅니다. [1, 2, 3, 4, 5, 6, 7]의 세 번째 숫자는 3입니다.

 


2. 문제풀이

풀이라고 적기도 민망하네요.

저는 간단하게 commands에서 자르라는 부분을

임시 vector<int>에다가 옮겼습니다.

이후 정렬을하여 원하는 부분을  answer에 추가하는 형식으로 문제를 풀었습니다.

소스코드를 확인해주세요.




3. 소스코드

3.1 주석없는 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <vector>
#include <algorithm>
using namespace std;
 
vector<int> solution(vector<int> array1, vector<vector<int>> commands) {
    vector<int> answer;
    for (int i = 0; i < commands.size(); i++){
        vector<int> temp;
        for (int j = commands[i][0- 1; j < commands[i][1]; j++)
            temp.push_back(array1[j]);
        sort(temp.begin(), temp.end());
        answer.push_back(temp.at(commands[i][2- 1));
    }
    return answer;
}

3.2 주석있는 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <vector>
#include <algorithm>
using namespace std;
 
vector<int> solution(vector<int> array1, vector<vector<int>> commands) {
    vector<int> answer;
    //반환되야되는 세트동안 반복
    for (int i = 0; i < commands.size(); i++){
        //임시 벡터 생성
        vector<int> temp;
        //필요한 부분만 임시벡터에 넣음
        for (int j = commands[i][0- 1; j < commands[i][1]; j++)
            temp.push_back(array1[j]);
        //임시 벡터정렬
        sort(temp.begin(), temp.end());
        //임시벡터의 index번째를 answer에 넣음
        answer.push_back(temp.at(commands[i][2- 1));
    }
    return answer;
}

3.3 테스트 코드 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
 
vector<int> solution(vector<int> array1, vector<vector<int>> commands) {
    vector<int> answer;
    //반환되야되는 세트동안 반복
    for (int i = 0; i < commands.size(); i++){
        //임시 벡터 생성
        vector<int> temp;
        //필요한 부분만 임시벡터에 넣음
        for (int j = commands[i][0- 1; j < commands[i][1]; j++)
            temp.push_back(array1[j]);
        //임시 벡터정렬
        sort(temp.begin(), temp.end());
        //임시벡터의 index번째를 answer에 넣음
        answer.push_back(temp.at(commands[i][2- 1));
    }
    return answer;
}
 
void print(vector<int> array1, vector<vector<int>> commands, vector<int> answer) {
    vector<int> t = solution(array1, commands);
    if (t == answer)
        cout << "정답" << endl;
    else
        cout << "틀림 "<< endl;
}
 
int main(){
    print({ 1526374 }, { {253},{441},{173} }, {563});
    return 0;
}

4. 결과

댓글

💲 광고입니다.