본문 바로가기

Algorithm/Programers - C++

[프로그래머스]문자열 다루기 기본 / multiset, sort

문제

풀이

#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

 

[C++] multiset container 정리 및 사용법

안녕하세요 ! BlockDMask 입니다. 오늘은, 연관 컨테이너(set, multiset, map, multimap)중 multiset 에 대해서 알아보겠습니다.! set과 구별되는 multiset의 가장 큰 특징은 key값이 중복된다는 것 입니다. 나머..

blockdmask.tistory.com

http://www.soen.kr/lecture/ccpp/cpp4/39-3-3.htm

 

혼자 연구하는 C/C++ by WinApi

39-3-다.역방향 반복자 역방향 반복자는 순회 방향이 거꾸로 되어 있는 반복자이다. 양방향 반복자나 임의 접근 반복자에 어댑터를 적용하여 구현되며 ++, -- 연산이 반대 방향으로 정의되어 있다.

www.soen.kr

http://atomic0x90.github.io/c++/2020/02/22/c++-sort.html 

 

atomic0x90(Yujun Han)

c와 c++ 를 사용하는 방법 설명 / 백준 온라인 저지 문제 풀이를 설명 / 나만의 프로그래밍 개발 일지 / 개발하면서 알게되는 것들을 저장하는 공간

atomic0x90.github.io