Home Coding Test [C++] - 정렬
Post
Cancel

Coding Test [C++] - 정렬

프로그래머스에 기재되어 있는 c++ coding test에 대해 리뷰하고자 합니다. 그 중에서도 연습문제에 해당하는 문제를 이 곳에 작성할 예정입니다. 다른 것을 참고하시려면 아래 링크를 클릭하시기 바랍니다.

  1. 해시
  2. 연습문제
  3. 완전탐색
  4. 카카오 블라인드 채용 문제


overview

Index

  1. k번째 수

k번째수

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
36
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

bool compare(const int& a, const int& b) {
    return a < b;
}

vector<int> solution(vector<int> array, vector<vector<int>> commands) {
    vector<int> answer;

    for (auto c : commands) {
        vector<int> arr(c[1] - c[0] + 1);

        // 특정 범위의 부분을 복사하기 위해 copy함수 사용, copy(원본 시작지점, 원본 끝지점, 복사될 시작지점);
        copy(array.begin() + c[0] - 1, array.begin() + c[1], arr.begin());

        // 정렬을 위해 sort함수 사용, 정확하게 파악하기 위해 compare함수 선언해보았습니다. sort(정렬 시작지점, 정렬 끝지점, 정렬 타입);
        sort(arr.begin(), arr.end(), compare);

        // 정렬된 백터에서 c[2] -1 번째 요소를 정답 vector에 삽입
        answer.push_back(arr[c[2] - 1]);
    }

    return answer;
}

int main() {
    vector<int> array { 1, 5, 2, 6, 3, 7, 4 }; 
    vector<vector<int>> commands{ {2, 5, 3}, { 4, 4, 1 }, { 1, 7, 3 } };

    cout << solution(array,commands);
}
1
2
3
입력값 	[1, 5, 2, 6, 3, 7, 4], [[2, 5, 3], [4, 4, 1], [1, 7, 3]]
출력 	
[5,6,3]

vector 함수

vector을 정렬하고 원하는 값들을 추출한다.

다양한 함수들은 연습문제에 적혀있으니 참고하고, 거기에 없는 부분들만 체크하고자 한다.

  • vector.remove_if(bool)
1
2
3
4
5
bool predicate(int num){
    return num>=100 && num<=200;
}

vector.remove_if(predicate)


가장 큰 수

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
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

bool compare(string a, string b) {
    return (a + b > b + a);
}

string solution(vector<int> numbers) {
    string answer = "";
    vector<string> str;
    
    for (int i : numbers)
        str.push_back(to_string(i));
    
    sort(str.begin(), str.end(), compare);
    
    for (auto i=str.begin();i<str.end();i++) {
        answer += *i;
    }
    
    if(answer[0] == '0'){
        answer = '0';
    }
    
    return answer;
}

다른 사람의 코드를 참고했는데, sort에 bool 함수를 집어넣고, 개별로 서로 비교하여 정렬하는 것이 핵심인 것 같다.


const

const는 값을 선언할 수 있도록 도와주는 키워드다. 즉, 값을 변경할 수 없게 한다. 따라서 const는 값을 한 번 설정하고, 그 값을 유지하면서 사용할 때 필요하다.

포인터와 const를 함께 사용하게 되면, 상수를 가르키는 포인터(* ptr)가 가르키는 공간은 수정할 수 없는(const) 공간이지만, 상수 변수의 주소를 가르키는 포인터는 수정할 수 있다.

1
2
3
4
5
int value = 5, value2 = 11;
const int * ptr = &value;
// *ptr = 10; // error! can't change const value
value = 10; // ok!
std::cout << value << " " << *ptr << std::endl; // 10 10

bool

bool 변수 선언

1
2
bool tr = true;
bool fa = false;

bool 함수 선언

1
2
3
4
bool b(a,b) {
    if(a == b) return true;
    return false;
}

sort

1
2
3
4
5
bool compare(string a, string b) {
    return (a + b > b + a);
}

sort(str.begin(), str.end(), compare);

compare 함수를 만들어서 sort의 세번째 인자 값으로 넣게 되면, 해당 함수의 반환 값에 맞게 정렬한다. 즉, true가 되도록 정렬하겠다는 의미이다.

* 포인터

포인터는 특정 값을 저장하는 것이 아니라 메모리 주소를 저장하는 변수다.

1
2
int value = 5;
int * ptr = &value;

ptr은 값으로 value 변수 값의 주소를 가지고 있다. 그러므로 ptr을 value 변수를 ‘가리키는’ 값이라고 할 수 있다.

&

to_string

to_string(숫자)를 하게 되면 숫자가 str로 변경된다.

stoi()

string을 int로 변환하기 위한 std::stoi()가 있다. 그 외에도 stol()(str to long long), stod()(str to double), stof()(str to float)등도 있다.

1
int i = std::stoi(int_val);


H-index

나의 전체 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;



int solution(vector<int> citations) {
    int answer = 0;
    
    vector<int> answ;
    
    sort(citations.begin(),citations.end(),greater<int>());
    
    for(auto i : citations)
        cout << i << endl;
    
    for(int i=0;i<citations.size();i++) {
        cout << i << " " << citations[i] << endl;
        if(citations[i] <= i) return i;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
입력값 	[10, 8, 5, 4, 3]
출력 	
10
8
5
4
3

0 10
1 8
2 5
3 4
4 3

정렬한 후 차례대로 비교했을 때 i가 증가한다는 것은 특정 값 이상인 논문이 i개 있다는 말과 같다. 즉 i가 3일때는 4보다 큰 값이 3개 있다는 것이고, i가 4일 때 3보다 큰 값이 4개 있으므로 i=4가 h의 최댓값이 된다.

greater()

sort는 기본적으로 오름차순으로 정렬한다. 내림차순으로 정렬하고자 하면, greater()를 사용하면 된다.

sort(start,end,greater<int>()) 을 하게 되면 내림차순으로 정렬된다.

This post is licensed under CC BY 4.0 by the author.