[프로그래머스] [C++] 큰 수 만들기 (greedy)
2021. 3. 26. 16:37ㆍ알고리즘/프로그래머스
1. 문제
코딩테스트 연습 - 큰 수 만들기 | 프로그래머스 (programmers.co.kr)
2. 풀이 1
간단하게 생각해서
각 숫자를 뒤에서부터 인덱스를 전부 기록했다.
그 다음 가장 큰것 중 완성 시킬 수 있는 것을 앞쪽부터 선택해나가면
답이 완성된다.
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
|
string selectNum(string& number, string& answer, int last, int k, vector<vector<int> >& idx) {
if(k == 0)
return answer;
for(int i = 9; i > -1; i--)
{
while(idx[i].size() != 0 && idx[i].back() < last)
idx[i].pop_back();
if(idx[i].size() == 0 || number.size() - idx[i].back() < k)
continue;
else {
answer += to_string(i);
last = idx[i].back();
idx[i].pop_back();
return selectNum(number, answer, last, k - 1, idx);
}
}
return "-1";
}
string solution(string number, int k) {
string answer = "";
vector<vector<int> > idx(10, vector<int>());
for(int i = number.size() -1; i > -1; i--)
idx[(int)number[i] - '0'].push_back(i);
return selectNum(number, answer, 0, number.size() - k, idx);
}
|
cs |
3. 풀이 2
max_element 의 iter을 받아서 erase (begin() + i, iter); 을 실행하여
조건문으로 스킵을 안해도 바로 건너 뛰게 할 수 있다.
덤으로 select 대신 number.begin() + i + 1 + k 를 사용하고
erase한 만큼 k를 감소시키면서 nuber에서 직접적으로 답을 구할 수 있다.
이 풀이는 위 풀이보다 직관적이다.
해당 구간안에서 가장 큰것을 선택하고 그 큰 것 뒤는 전부 지우는 것이다.
iterator로 number을 처음부터 탐색했으면 더 구현이 직관적이었을 것이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
string solution(string number, int k) {
vector<char> answer;
int maxc = '0', select = number.size() - k;
number = "0" + number;
for(int i = 0; i < number.size(); i++) {
if(select == 0)
break;
if(number[i] < maxc)
continue;
int last = number.size() + 1 - select;
maxc = *max_element(number.begin() + i + 1, number.begin() + last);
answer.push_back((char)maxc);
select--;
}
return string(answer.begin(), answer.end());
}
|
cs |
3. 풀이3
이 풀이는 다른 답안의 첫번째 풀이이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
string solution(string number, int k) {
string answer = number.substr(k);
for(int i = k-1; i >= 0; i--) {
int j = 0;
while(true) {
if(number[i] >= answer[j]) {
swap(number[i], answer[j]);
j++;
}
else
break;
}
}
return answer;
}
|
cs |
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] [C++] 등굣길 (dp) (0) | 2021.03.27 |
---|---|
[프로그래머스] [C++] 위장 (brute-force) (0) | 2021.03.26 |
[프로그래머스] [C++] 이중우선순위큐 (sort, bst, map) (0) | 2021.03.23 |
[프로그래머스] [C++] 기능개발 (stack, queue) (0) | 2021.03.23 |
[프로그래머스] [C++] 입국심사*** (binary search) (0) | 2021.03.23 |