프로그래머스에 기재되어 있는 c++ coding test에 대해 리뷰하고자 합니다. 그 중에서도 연습문제에 해당하는 문제를 이 곳에 작성할 예정입니다. 다른 것을 참고하시려면 아래 링크를 클릭하시기 바랍니다.
overview
Index
- 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>())
을 하게 되면 내림차순으로 정렬된다.