문제 설명
주어진 정수를 내림차순으로 자릿수를 정렬하여 새로운 정수를 만들어 출력하는 문제입니다.
예를 들어, 주어진 정수가 4213이면, 자릿수를 내림차순으로 정렬한 결과는 4321입니다.
이 문제는 C++ 코딩테스트에서 자주 출제되는 유형으로, 정렬 알고리즘에 대한 이해를 바탕으로 문제를 해결하는 능력을 테스트합니다.
문제 입력
첫 번째 줄에 정수 N (0 ≤ N ≤ 2,147,483,647)이 주어집니다.
문제 출력
정수 N의 자릿수를 내림차순으로 정렬하여 새로운 정수를 출력합니다.
입력 예시
4213
출력 예시
4321
해결 과정
이 문제를 해결하기 위해서는 몇 가지 단계를 거쳐야 합니다.
주요 단계는 다음과 같습니다.
1. 입력받기
먼저 정수를 입력받아야 합니다.
C++에서는 cin
을 사용하여 사용자로부터 입력을 받을 수 있습니다.
입력받은 정수는 이후에 문자형으로 변환하여 자릿수를 분리하는 과정에서 활용될 것입니다.
2. 자릿수 분리
입력받은 정수를 문자 배열로 변환한 후, 각 자릿수를 개별적으로 분리할 수 있습니다.
C++에서 to_string
함수를 사용하면 정수를 문자열로 변환할 수 있습니다.
이렇게 변환된 문자열의 각 문자를 벡터에 저장할 수 있습니다.
3. 내림차순 정렬
각 자릿수를 분리한 후에는, 이를 내림차순으로 정렬해야 합니다.
C++의 sort
함수를 사용할 수 있으며, 이때 비교 함수를 이용하여 내림차순 정렬을 수행할 수 있습니다.
특히, 자릿수를 문자로 정렬되기 때문에 숫자의 ASCII 값을 고려하여 정렬해야 합니다.
4. 정수 변환
정렬된 자릿수를 다시 문자열로 변환한 후, 이를 정수형으로 변환하여 최종 결과를 도출합니다.
마지막으로 cout
을 사용하여 결과를 출력하면 됩니다.
코드 예제
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
int main() {
// 1. 입력받기
int N;
cin >> N;
// 2. 자릿수 분리
string str = to_string(N);
vector digits(str.begin(), str.end());
// 3. 내림차순 정렬
sort(digits.begin(), digits.end(), greater());
// 4. 정수 변환
string sorted_str(digits.begin(), digits.end());
int result = stoi(sorted_str);
// 결과 출력
cout << result << endl;
return 0;
}
결과
위의 코드를 실행하면 입력된 정수의 자릿수를 내림차순으로 정렬한 결과를 볼 수 있습니다.
예를 들어 4213을 입력했을 때 4321이 출력되는 결과를 확인할 수 있습니다.
예외 처리
이 문제를 해결하기 위해서는 예외적인 상황도 고려해야 합니다.
예를 들어, 입력값이 0일 경우, 출력 역시 0이 되어야 합니다.
따라서 코드를 작성할 때는 이러한 예외 상황에 대한 처리도 추가해야 합니다.
예외 처리 코드 예제
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
int main() {
// 1. 입력받기
int N;
cin >> N;
// 0 예외 처리
if (N == 0) {
cout << 0 << endl;
return 0;
}
// 2. 자릿수 분리
string str = to_string(N);
vector digits(str.begin(), str.end());
// 3. 내림차순 정렬
sort(digits.begin(), digits.end(), greater());
// 4. 정수 변환
string sorted_str(digits.begin(), digits.end());
int result = stoi(sorted_str);
// 결과 출력
cout << result << endl;
return 0;
}
결론
이번 강좌에서는 내림차순으로 자릿수를 정렬하는 알고리즘 문제를 해결하는 방법에 대해 알아보았습니다.
C++의 기본적인 입출력 및 자료구조를 활용하여 문제를 해결할 수 있었습니다.
이러한 유형의 문제는 기본적인 알고리즘 능력을 기르는 데 큰 도움이 됩니다.
동일한 논리를 바탕으로 다른 문제들도 응용할 수 있으므로, 다양한 문제를 풀어보며 실력을 향상시키기를 바랍니다.