Code KATA/알고리즘 코드카타

[2024.12.21] 정수 내림차순으로 배치하기

iiblueblue 2024. 12. 23. 10:30

문제 설명

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

 

 

제한사항

  • n은 1이상, 8000000000 이하인 양의 정수입니다.

 

입출력 예

n return
118372 873211

 

 

문제 풀이

풀이 언어 : C++

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

using namespace std;

long long solution(long long n) {
    long long answer = 0;
    long long myN=n;
    int seperateNum;
    vector<int> seperateResult;
    
    
    // 해체 하기
    for(int i=to_string(n).size()-1; i>-1; i--)
    {
        seperateNum=myN/pow(10, i);
        seperateResult.push_back(seperateNum);
        myN-=seperateNum*pow(10, i);
    }
    
    // 정렬 하기
    sort(seperateResult.begin(), seperateResult.end());
    
    // 조립 하기
    for(int i=to_string(n).size()-1; i>-1; i--)
    {
        answer+=seperateResult[i]*pow(10, i);
    }
    
    return answer;
}

 

 

간단히 풀이를 이야기하면 정수를 해체하고 예쁘게 정렬하고나서 다시 조립하였다.

 

해체 하기

여직 풀었던 많은 문제들과 똑같이 일단 정수를 쪼개는 것부터 시작했다. 이전과 완전히 똑같은 알고리즘을 사용했기 때문에 정수 해체는 아래 글을 참고하면 된다. 해체한 정수는 하나씩 벡터에 넣어서 저장한다.

 

정렬 하기

다음으로 sort()함수를 이용해서 정렬을 진행한다. 나는 오름차순으로 정렬한 후 다시 조립할 때 반대로 해주었지만 사실 내림차순으로 정리하고 그대로 조립해도 상관없다.

 

조립 하기

마지막으로 정렬된 벡터를 하나씩 빼서 다시 조립해주면 된다. answer에 벡터에 있는 수에 10의 i제곱들을 곱해서 계속 더해가면 정답이 된다.

 

참고사항

sort(iterator startPosition, iterator endPosition)은 시작 위치부터 끝 위치까지의 배열이나 벡터의 원소들을 정렬해주는 함수이다. 매개변수는 iterator, 즉 포인터이고 배열의 경우 배열의 이름이 포인터기 때문에 배열의 이름과 배열 이름+배열의 크기를 넘겨주면 된다. 벡터는 벡터의 시작주소를 가리키는 begin()과 마지막 주소를 반환하는 end()를 사용하면 된다.

 

벡터를 내림차순으로 정렬할 때는 rbegin(), rend()를 사용하면 된다. 마지막으로 세 번째 매개변수에 함수 포인터 또는 함수 객체를 넣으면 내가 원하는 조건으로도 정렬이 가능하다. 그 함수는 반환타입이 bool 타입이어야 하고 매개변수는 두 개이며 두 매개변수의 타입은 정렬한 데이터 타입과 일치해야 한다.

...
// 오름차순 정렬
sort(v.begin(), v.end());
sort(arr, arr+10);

// 내림차순 정렬
sort(v.rbegin(), v.rend());

// 다른 정렬 기준 추가
bool cmp(int a, int b)
{
	return a>b;
}

sort(v.begin(), v.end(), cmp);
sort(arr, arr+10, cmp);
...

 

 

오답 노트

코드 줄 수를 줄여보기 위해 seperateNum을 생략하고 코드를 작성하였는데 이상하게 작동되지 않았다.

 

...
    
    // 해체 하기
    for(int i=to_string(n).size()-1; i>-1; i--)
    {
        seperateResult.push_back(myN/pow(10, i));
        myN-=(myN/pow(10, i))*pow(10, i);
    }
...

 

 

 

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/12933

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr