[프로그래머스] 정수 내림차순으로 배치하기 (Lv.1)
문제 링크
문제 설명
함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은순으로 정렬한 새로운 수를 리턴해주세요. 예를들어 n이 118372이면 873211을 리턴하면 됩니다.
제한사항
- n은 1이상 8,000,000,000 이하인 자연수입니다.
내 풀이
to_string()으로 숫자를 문자열로 변환한 뒤, 문자 단위로 내림차순 정렬한다.
문자 비교 시 '9' > '8' > ... > '0'이 성립하므로 커스텀 비교 함수 없이 a > b 조건만으로 자릿수 내림차순 정렬이 가능하다.
정렬 후 stoll()로 다시 숫자로 변환해 반환한다.
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
long long solution(long long n) {
long long answer = 0;
string numbers = to_string(n);
sort(numbers.begin(), numbers.end(), [](char a, char b) {
return a > b;
});
answer = stoll(numbers);
return answer;
}
시간복잡도 분석
to_string(n): O(D), D = 자릿수 (n ≤ 8,000,000,000이므로 최대 10자리)sort: O(D log D), D ≤ 10stoll: O(D)- 전체: O(D log D) ≈ O(1) (D가 최대 10으로 고정이므로 사실상 상수)
오답노트
처음에 stoi밖에 생각이 나지 않아 stoi로 numbers를 int형으로 캐스팅하고 long long 타입으로 캐스팅 하려 했다. 애초에 numbers의 길이가 int형에 담길 수 없어 오류가 발생했다.
그래서 혹시 하고 stoi의 i가 int니까 longlong을 줄여 ll로 바꾸면 되지 않을까 했더니 됐다.ㅋㅋ
후기
사람이 생각하는게 어쩌면 거기서 거기인 것 같기도 하다.