https://www.acmicpc.net/problem/1174
1174번: 줄어드는 수
음이 아닌 정수를 십진법으로 표기했을 때, 왼쪽에서부터 자리수가 감소할 때, 그 수를 줄어드는 수라고 한다. 예를 들어, 321와 950은 줄어드는 수이고, 322와 958은 아니다. N번째로 작은 줄어드는
www.acmicpc.net
브루트포스 문제.
줄어 드는 수 중 가장 큰 수는 9876543210 이므로,
0부터 숫자를 1씩 증가하면서 "줄어드는 수" 인지 체크하는 방법은 TLE를 받게 된다.
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 순으로 배열된 배열에서 각각의 숫자를 포함하거나
포함하지 않는 경우를 기준으로 브루트포싱을 해주면
순회 횟수가 2^10 밖에 되지 않으므로 무난하게 해결할 수 있다.
비트마스킹을 통해서 브루트포싱을 진행했다.
가장 큰 수인 9,876,543,210 은 90억으로 INT범위를 넘어가니
long long 형을 사용해줘야 한다.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
bool chk(int k){
int now = k%10;
while(k/10){
k/=10;
if(k%10 <= now) return false;
else{
now = k%10;
}
}
return true;
}
vector<ll> v;
int arr[] = {9,8,7,6,5,4,3,2,1,0};
int main(){
for(int i=1; i<(1<<10); i++){
int tmp = i;
ll val = 0;
int idx = 0;
while(tmp){
if(tmp%2 == 1) val = val*10 + arr[idx];
tmp /= 2;
idx++;
}
v.push_back(val);
}
sort(v.begin(), v.end());
int N;
cin >> N;
if(v.size() < N) cout << -1;
else cout << v[N-1];
return 0;
}
반응형