Mosu(정종인) 2022. 1. 22. 15:53
반응형

https://www.acmicpc.net/problem/1422

 

1422번: 숫자의 신

첫째 줄에 K와 N이 공백을 사이에 두고 주어진다. K와 N은 각각 50보다 작거나 같은 자연수이고, N은 K보다 크거나 같다. 둘째 줄에는 K개의 수가 한 줄에 하나씩 주어진다. 각 수는 1,000,000,000보다

www.acmicpc.net

K개 수 중 N개를 중복으로 뽑아서 가장 큰 수를 만드는 문제다. (단 모든 수를 다 써야 함)

아이디어 : 

숫자들을 잘 정렬하는 문제다. 우선 이 숫자들을 모두 문자열로 취급 할 것이다.
모든 문자열을 정렬해서, 순서대로 출력할 것이다.
출력할 때, 길이가 가장 긴 문자열은 N-K+1번만큼 연속으로 출력해준다.

구현 : 

문자열 x와 문자열 y의 우선순위를 비교할 때, x+y와 y+x를 비교한다. (여기서 +는 이어붙임을 의미함)
x+y가 y+x보다 사전순으로 더 크면, x가 먼저 와야하고, 그게 아니면 y가 먼저 와야 한다.

코드 : 

#include <bits/stdc++.h>
using namespace std;
vector<pair<string, int> > v;
bool comp(pair<string, int> x, pair<string, int> y){
	int xl=x.first.size();
	int yl=y.first.size();
	string xtemp=x.first+y.first;
	string ytemp=y.first+x.first;
	for(int i=0; i<xl+yl; ++i){
		if(xtemp[i]!=ytemp[i]){
			return xtemp[i]>ytemp[i];
		}
	}
	return xl<yl;
}
int main(){
	int K,N; cin>>K>>N;
	int maxlen=-1;
	for(int i=0; i<K; ++i){
		string str; cin>>str; v.push_back({str,i});
		maxlen=max(maxlen, (int)str.size());
	}
	vector<pair<string,int> > temp;
	for(int i=0; i<v.size(); ++i){
		if(v[i].first.size()==maxlen){
			temp.push_back(v[i]);
		}
	}
	sort(v.begin(), v.end(), comp);
	sort(temp.begin(), temp.end(), comp);
	int flag=temp[0].second;
	for(int i=0; i<v.size(); ++i){
		if(v[i].second==flag){
			for(int j=0; j<N-K+1; ++j){
				cout << v[i].first;
			}
		}
		else{
			cout << v[i].first;
		}
	}
	cout << '\n';
}
반응형
댓글수0