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

NJW·2021년 8월 17일
0

코테

목록 보기
51/170

들어가는 말

정수형으로 받은 숫자들을 정렬해서 하나의 내림차순으로 된 정수를 반환하는 방법이다.

코드 설명

총 네개의 파트로 나눠진 걸 볼 수 있다.
첫 번째는 변수들 모아 놓은 파트. answer은 출력할 답, v1은 숫자들을 정렬하기 위한 벡터, tmp는 정렬할 때(버블 정렬 이용) swap을 위한 변수, count와 zero는 벡터를 다시 정수로 바꿔주기 위한 변수이다.

첫 번째 while문은 받은 정수를 하나의 숫자로 떨구어 벡터에 저장하는 방식이다. n이 0보다 클 때까지 반복하는데, n을 10으로 나눈 나머지를 배열에 저장하고 n을 10으로 나누어 숫자를 점점 줄여준다.

두 번째 for문은 배열에 넣은 숫자들을 내림차순으로 정렬하는 것이다. 정렬 방식에는 버블 정렬을 사용했다. 다른 정렬 방식도 많겠지만, 일단 떠오르는 정렬이 버블 정렬이라서...
swap 함수를 따로 써줘서 호출할까 싶었지만, 그냥 조건문 안에 넣기로 했다.

세 번째 while문은 배열을 하나의 정수로 바꿔주는 반복문이다. 0에서 시작해 반복문 안에서 하나씩 더해지는 cout가 벡터의 크기만큼 반복되도록 했다.
정수형으로 바꿀 때는 제일 앞에 있는 값에 10의 zero승을 해주어서 더해주는 방식을 사용했다. 만일 v1의 첫 값이 8이라면, 8곱하기 10의 5제곱이렇게 되는 것이다. 여기서 zero는 v1의 크기보다 -1을 해주었다. 다음 zero를 계속 줄여주면, 8곱하기 10의 5제곱 + 7곱하기 10의 4제곱 + 3곱하기 10의 3제곱 + ... 이런 방식으로 하나의 정수가 된다.

코드

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

using namespace std;

long long solution(long long n) {
    long long answer = 0;
    vector<int> v1;
    int tmp = 0;
    int count = 0;
    int zero = v1.size() - 1;
    
    while(n > 0){
        v1.push_back(n%10);
        n = n / 10;
    }
    
    for(int i = v1.size() - 1; i > 0; i--){
        for(int j = 0; j < i; j++){
            if(v1[j] < v1[j + 1]){
                tmp = v1[j];
                v1[j] = v1[j + 1];
                v1[j + 1] = tmp;
            }
        }
    }
    
    while(count < v1.size()){
        answer = answer + (v1[count]*pow(10,zero));
        count++;
        zero--;
    }
    
    return answer;
}

P.s

다른 사람들 풀이에서 sort라는 함수를 발견했다. sort를 사용하면 내가 두 번재 반복문에서 버블 정렬을 사용할 필요가 없었을 것이다. sort로 오름차순으로 정렬을 한 뒤, 10을 0부터 제곱을 해주면 더 간단한 코드가 되는 걸 볼 수 있다.

profile
https://jiwonna52.tistory.com/

0개의 댓글