Algorithm/기타(기업등)
[EPPER/14회 5번]단어 게임(상-2)
IagreeBUT
2021. 3. 18. 13:33
728x90
<문제>
<입력예시>
단어와 단어의 첫글자들은 배열(c)/vector(c++)로 주어짐
만족해야하는 조건
1. 미리 주어진 (입력받은) 단어 목록일 것
→ 전달받은 단어 배열 내로 정답을 한정함
2. 첫글자가 동일해야할 것
→ 리스트를 for문으로 탐색하면서 첫글자가 동일할 떄 까지 비교
3. (2번 조건이 중복될 경우) 최소 횟수로 언급한 것 이어야 할 것
4. (3번 조건까지 중복될 경우) 알파벳 순서로 답할 것
→ 언급횟수를 기준으로 정렬 + 언급횟수가 같으면 알파벳순으로 정렬
정렬을 해주면 for문으로 첫글자만 비교해서 첫번째로 같은 것을 정답으로 생각해 줄 수 있음
<코드>
// 실제 시험에서는 Solution 클래스의 solution 함수를 사용합니다. 이를 감안하여 풀이해주세요.
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
/*
답변을 선택할 때 고려해야할 사항을 순서대로 말하면,
1. 주어진 글자로 시작하는 단어 고르기
2. (1)이 여러개라면, 가장 적게 말한 단어 고르기 -> 이 조건을 위해 그냥 단어를 언급횟수 순서로 정렬하면 굳이 고려할 필요가 없음!
3. (2)이 여러개라면, 알파벳 순으로 고르기 -> 이 조건을 위해 그냥 단어를 알파벳 순서로 정렬하면 굳이 고려할 필요가 없음!
단어와 함께 단어가 언급된 횟수를 저장해야함 => vector pair로 단어,언급횟수를 묶음
이렇게되면 2,3번은 그냥 정렬해놓고 1번만 고려하면됨
-> vector pair를 sort함수를 이용하여
1. 언급횟수순서대로 정렬
2. 언급횟수가 같은경우 알파벳순으로 정렬
-> 이 상태로 정렬한 후
첫글자가 주어질 때마다 pair에서 순서대로 첫글자가 맞으면 출력한 후 언급횟수를 ++해주고 재정렬하면됨
*/
vector<pair<string,int>> wordTable;
//단어목록과 언급횟수를 pair로 만듬
bool compare(pair<string,int> a, pair<string,int> b){
//적게 말한단어가 앞으로 -> 오름차순
if(a.second == b.second){ //언급 횟수가 같다면
return a.first<b.first; //알파벳 순서대로(오름차순)
}else{//언급횟수 다르면
return a.second<b.second; //언급횟수에서 오름차순으로 정렬
}
}
void solution(vector<string> word, vector<char> start, int K, int N){
//pair로 (word,0)으로 초기화
for(int i=0;i<K;i++){
wordTable.push_back({word[i],0});
}
//언급횟수를 우선으로 -> 같으면 알파벳 순서대로 정렬 (최초수행)
sort(wordTable.begin(),wordTable.end(),compare);
//입력받은 시작 문자 숫자만큼 반복
for(int k=0;k<N;k++){
//입력받은 단어목록 만큼 반복
for(int j=0;j<K;j++){
//첫자를 비교하기 위해 첫자를 저장함
char S = wordTable[j].first.at(0);
//첫자와 시작문자가 같은 경우
if(start[k]==S){
//해당 단어가 답이므로 이를 출력
cout<<wordTable[j].first<<endl;
//언급했으므로 언급횟수를 1회증가시킴
wordTable[j].second++;
//횟수가 증가되었으므로 재정렬함
sort(wordTable.begin(),wordTable.end(),compare);
//이미 단어목록에서 답을 했으므로 다음 단어를 탐색할 필요가 없으므로 종료
break;
}
}
}
}
int main() {
int K,N;
vector<string> word;
vector<char> start;
string wordType;
char startType;
cin>>K>>N;
for(int i=0;i<K;i++){
cin>>wordType;
word.push_back(wordType);
}
for(int i=0;i<N;i++){
cin>>startType;
start.push_back(startType);
}
solution(word,start,K,N);
return 0;
}
728x90