문제
풀이
#include <string>
#include <vector>
#include <set>
using namespace std;
string solution(string s) {
string answer = "";
multiset<char> set;
for(auto i : s) set.insert(i);
for(auto i = set.rbegin(); i!= set.rend(); i++) answer += *i; // 역방향 반복자
return answer;
}
해결방법
-multiset컨테이너를 사용해 중복을 허용하여 문자를 순서대로 정렬
-역방향 반복자로 컨테이너를 순회하며 answer에 문자 삽입
역방향 반복자
rbegin()은 마지막 원소를 가리키고, rend()는 첫 번째 원소의 하나 더 앞을 가리킨다.
multiset
- set과 같이 원소들이 자동으로 정렬되나, set과 달리 값의 중복을 허용하는 컨테이너
- <set> 헤더에 들어있다.
++
Java로 똑같은 알고리즘을 만들어 해결하려고 했을경우
실행한 결괏값은 Zgfedcb 이 된다.
왜 Java와 C++이 다른지, C++의 Set과 Java의 Set이 다른점이 있는건지 확인해봐야겠다..
시도했던 Java코드
import java.util.*;
class Solution {
public String solution(String s) {
String answer = "";
Set<Character> set = new HashSet<Character>();
for(int i=0; i<s.length(); i++) set.add(s.charAt(i));
Iterator<Character> it = set.iterator();
while(it.hasNext()){
answer = it.next() + answer;
}
return answer;
}
}
해결한 Java코드.
import java.util.*;
class Solution {
public String solution(String s) {
String answer = "";
char[] arr = s.toCharArray();
Arrays.sort(arr);
for(int i=0; i<arr.length; i++){
answer = arr[i] + answer ;
}
return answer;
}
}
다른 사람 풀이
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
string solution(string s) {
sort (s.begin(), s.end(), greater<char>());
return s;
}
sort(start, end, grearter <자료형>())를 이용하면 [start, end) 범위의 인자를 내림차순으로 정렬할 수 있다.
sort(numbers.rbegin(), numbers.rend());
위의 코드로도 같은 결과를 낼 수 있다.
https://blockdmask.tistory.com/80
http://www.soen.kr/lecture/ccpp/cpp4/39-3-3.htm
http://atomic0x90.github.io/c++/2020/02/22/c++-sort.html
'Algorithm > Programers - C++' 카테고리의 다른 글
[프로그래머스]수박수박수박수박수박수? (0) | 2022.02.15 |
---|---|
[프로그래머스]문자열 다루기 기본/isdigit (0) | 2022.02.14 |
[프로그래머스]문자열 내 p와 y의 개수 (0) | 2022.02.12 |
[프로그래머스]문자열 내 마음대로 정렬하기 / multimap (0) | 2022.02.11 |
[프로그래머스]스택/큐 - 주식가격 (0) | 2022.02.08 |