C++ Programmers Test/Level 1

[Programmers] [C++] 정수 내림차순으로 배치하기 / 자연수 뒤집어 배열로 만들기

시카Dev 2025. 1. 9. 01:39

 

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

<제한 조건>
n은 1이상 8000000000 이하인 자연수입니다.

<입출력 예>
n	return
118372	873211

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

using namespace std;

long long solution(long long n) {
    
    string num = to_string(n);
    sort(num.begin(), num.end(), greater<>());
         
    return stol(num);
}

 

sort 함수가 지원하는 오름차순/내림차순을 사용하면 좋다

이때 끝이 greater<>()라면 내림차순이고 less<>()라면 오름차순이다! 오름차순 쓸거면 less는 안써도 된다

다만 c++14 이전이라면 greater<int>() 이런 식으로 자료형을 명시해야 한다

 

stol은 string to long인데 stoi처럼 형변환을 해준다. stoll도 있다

 

std::stoi, std::stol, std::stoll - cppreference.com

int       stoi ( const std::string& str,                  std::size_t* pos = nullptr, int base = 10 ); (1) (since C++11) int       stoi ( const std::wstring& str,                  std::size_t* pos = nullptr, int base = 10 ); (2) (si

en.cppreference.com

 

공식 레퍼런스에 잘 설명되어 있다

 


 

<문제 설명>
자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요.
예를 들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.

<제한 조건>
n은 10,000,000,000이하인 자연수입니다.

<입출력 예>
n	return
12345	[5,4,3,2,1]

 


#include <string>
#include <vector>

using namespace std;

vector<int> solution(long long n) {
    vector<int> answer;
    string num = to_string(n);
    
    for (int i = num.length() - 1; i >= 0; i--) {
        answer.push_back(num[i] - 48);
    }

    return answer;
}

 

왜 48을 빼었느냐? 저도 잘 모릅니다... 어거지로 끼워 맞췄읍니다...

정확한 해설을 위해 채찍피티 쌤에게 물어보기로 했다

 

문자 0은 아스키 값으로 48이다. 따라서 num[i]가 '5'라면 53의 값을 가진다. 

테스트 시 결과값이 [5, 4, 3, 2, 1]가 아니라 [53,52,51,50,49]으로 나온 건 아스키코드 때문에 그렇다.

때문에 각 값에서 48을 빼면 문자열에서 숫자로 변환되는 것과 같은 결과를 제공한다

 

문자가 0부터 9까지일때의 아스키값 표를 가져와봤다

 

48 빼기... 간결하면서 좋은 아이디어인 것 같다. 실제 코테에서도 언젠가 쓸 날이 오길 바라며~