-
1422번 : 숫자의 신알고리즘/백준(acmicpc.net) 문제풀이 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'; }
반응형'알고리즘 > 백준(acmicpc.net) 문제풀이' 카테고리의 다른 글
1017번 : 소수 쌍 (0) 2022.01.31 2123번 : 인간 탑 쌓기 (0) 2022.01.29 1369번 : 배열값 (0) 2022.01.22 1154번 : 팀 편성 (0) 2022.01.16 1131번 : 숫자 (0) 2022.01.14