[Programmers] [C++] 정수 내림차순으로 배치하기 / 자연수 뒤집어 배열로 만들기
<문제 설명>
함수 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 빼기... 간결하면서 좋은 아이디어인 것 같다. 실제 코테에서도 언젠가 쓸 날이 오길 바라며~