[프로그래머스/C++] ㅡ LV1 - 정수 내림차순으로 배치하기

2021. 3. 27. 17:31필요/코딩테스트(프로그래머스)

문제

programmers.co.kr/learn/courses/30/lessons/12933

 

코딩테스트 연습 - 정수 내림차순으로 배치하기

함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다. 제한 조건 n은 1이

programmers.co.kr

풀이

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

long long solution(long long n) {
    string s = to_string(n);
    vector<int> a;
    for (int i=0; i<s.size(); i++) {	// vector a 에 대입
        a.push_back(s[i]-'0');
    }
    sort(a.begin(), a.end(), greater<int>());	// 내림차순으로 sort
    s = "";
    for (int i=0; i<a.size(); i++) {	// string에 대입
        s+=to_string(a[i]);
    }
    long long answer = stoll(s);	// long long으로 형변환
    return answer;
}

개념

to_string()은 숫자타입(int, long 등)의 데이터를 string으로 바꾸는 함수이다.

stoll()은 string을 long long으로 바꿔주는 함수이다.


 

풀이

처음 문제를 봤을 때, 바로 생각나는 방법으로 문제를 풀었다.

 

숫자 -> 문자열

이유 : 자릿수 별로 값을 옮기기 위해

 

문자열 -> 숫자(vector)

이유 : 숫자를 통해 sort 하기 위해

 

숫자 -> 문자열

이유 : 자릿수 별로 값을 옮기기 위해

 

문자열 -> 숫자

이유 : 출력을 위해

 

그 과정에서 s는 초기화한뒤 한번 더 사용했다.

 


+a

위 방식은 형변환이 너무 많아 번거롭다.

사실 숫자가 아니여도 sort 할 수 있다.

이 경우 아스키코드에 따라 사전순 나열이 되는데, 이렇게 하면 vector를 사용하지 않아도 된다.

그리고 문자열-> 숫자, 숫자-> 문자열의 과정을 없애도 된다.

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

long long solution(long long n) {
    string s = to_string(n);
    sort(s.begin(), s.end(), greater<char>());
    long long answer = stoll(s);
    return answer;
}