https://www.acmicpc.net/problem/1427
1427번: 소트인사이드
첫째 줄에 정렬하려고 하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다.
www.acmicpc.net
1) 문제
배열을 정렬하는 것은 쉽다. 수가 주어지면, 그 수의 각 자리수를 내림차순으로 정렬해보자.
2) 입력
첫째 줄에 정렬하려고 하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다.
3) 출력
첫째 줄에 자리수를 내림차순으로 정렬한 수를 출력한다.
예제 입력
[접근 방법]
1. 숫자 N을 입력받는다.
2. Vector 하나를 만들고 while 문을 이용해 N의 각 자릿수를 push_back 한다.
3. Vector 를 정렬하고 역순으로 바꿔준다.
4. Vector 의 모든 원소를 출력한다.
간단한 문제이다.
[코드 설명]
문제의 조건을 보면 N은 1,000,000,000보다 작거나 같은 자연수이다.
int 형 변수의 범위는 -21억~21억까지 이므로 long대신 그냥 int형을 사용해도 된다.
int 형 변수 N, size 를 만들고 size=0으로 초기화한다. 이는 숫자의 자릿수를 나타낸다.
while (N > 0) {
int num;
num = N % 10;
v.push_back(num);
N /= 10;
size++;
}
이 문제의 핵심이 되는 코드이다.
보통 다른 문제에서도 많이 쓰이는 방법인데, 자릿수마다 숫자를 알아내기 위해 while 문을 이용한다.
num 이라는 변수를 만들고 여기에 N의 일의 자리를 저장한다. 이는 10으로 나눈 나머지를 의미한다.
이후 이 숫자를 벡터 V에 넣고 N을 10으로 나눠준다. 이렇게 되면 1의 자리부터 차근차근 모든 숫자를 구할 수 있다.
size 는 N의 몇 자리수인지 알기 위해 만든 변수이다.
결국 N은 점점 나뉘어져 0이 되고 while문을 종료한다.
sort(v.begin(), v.end()); // 정렬
reverse(v.begin(), v.end()); // 역순으로 바꿈
다음으로 'sort' 와 'reverse' 를 이용해 벡터를 정렬하고 역순으로 바꿔준다.
이는 모두 'algorithm' 헤더에 들어있으며, 'sort' 는 기본적으로 오름차순으로 정렬해준다.
'reverse' 는 벡터의 모든 원소를 역순으로 바꾼다.
따라서 문제가 원하는 답인 각 자리의 숫자를 내림차순으로 출력할 수 있다.
[ 최종 코드 ]
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(void) {
int N;
int size = 0;
cin >> N;
vector <int> v;
while (N > 0) {
int num;
num = N % 10;
v.push_back(num);
N /= 10;
size++;
}
sort(v.begin(), v.end());
reverse(v.begin(), v.end());
for (int i =0;i<size;i++)
cout << v[i];
}
[느낀점]
간단한 문제였다. 만약 N의 범위가 커진다면 조금 문제가 됐을 수도 있다.
숫자의 각 자리 숫자를 분리하는 방법과 정렬하는 방법만 알면 풀 수 있다.