깔끔하게 풀어내서 마음에 드는 문제
https://www.acmicpc.net/problem/2992
2992번: 크면서 작은 수
정수 X가 주어졌을 때, X와 구성이 같으면서 X보다 큰 수 중 가장 작은 수를 출력한다. 수의 구성이 같다는 말은, 수를 이루고 있는 각 자리수가 같다는 뜻이다. 예를 들어, 123과 321은 수의 구성이
www.acmicpc.net
정수X의 자릿수를 쪼개서 어찌저찌 만들어도 되겠다만,
문자열 S에 대해서 '0' ~ '9' 사이의 대소관계는 0~9 사이의 대소관계와 똑같이 계산할 수 있고,
문자열의 길이가 서로 다 같아서 문자열의 길이가 달라지는 경우도 고려 안해줘도 되기때문에
X를 정수로 입력받는것이 아니라 문자열 S로 받았고,
문자열 S는 요컨데 char형의 배열이라고 볼 수 도 있기 때문에
char형 배열 S를 정렬해주고
next_permutation 함수를 통해서 구성이 같은 모든 수에 대해
브루트포싱을 진행해줬다.
앞선 특성 때문에 단순히 부등호로도 두 문자열을 대소비교할 수 있어서,
소스코드의 길이도 짧아지고 깔끔한 형태로 해결할 수 있었다.
고민좀해보면 최솟값이 나왔을때 break 등으로
시간을 아낄수도 있을것같은데
6! = 720 이라 별로 큰 범위도 아니라서
크게 부담없이 해결할 수 있다.
#include <bits/stdc++.h>
using namespace std;
int main(){
string s,k,a="9999999";
cin>>s;
k=s;
sort(k.begin(),k.end());
do{
if(k>s) a=min(a,k);
}while(next_permutation(k.begin(),k.end()));
if(a=="9999999") cout<<0;
else cout<<a;
return 0;
}
반응형