하루하루 꾸준히, 인생은 되는대로

알고리즘

백준 1599 민식어 C++

긤효중 2022. 7. 13. 20:06

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

 

1599번: 민식어

무엇인가를 창조하는 것은 어렵다. 오민식은 지금까지 어려운 다른나라의 언어를 쓰면서 백성들이 고통에 받는 것을 슬퍼하고 새로운 언어를 만들고자 했다. 그는 창조의 고통에 시달리던 중에

www.acmicpc.net


문제

무엇인가를 창조하는 것은 어렵다. 오민식은 지금까지 어려운 다른나라의 언어를 쓰면서 백성들이 고통에 받는 것을 슬퍼하고 새로운 언어를 만들고자 했다. 그는 창조의 고통에 시달리던 중에 결국 오영식에게 자신의 못다 이룬 꿈을 꼭 이루어달라면서 오영식에게 창조의 임무를 넘겼다.

오영식은 자신의 형이 창조에 고통에 시달리는 모습을 보고 마음이 아파서 자신은 창조를 하지 않기로 했다. 영식이는 표절을 하기로 했는데 세계적인 추세에 맞게 영어를 표절하기로 했다.

영식이는 자신의 형의 이름을 따서 민식어라고 이름붙였다.

민식어에는 알파벳이 20개가 있다.

영어는 a b c d e f g h i j k l m n o p q r s t u v w x y z의 순서이지만, 민식어는 a b k d e g h i l m n ng o p r s t u w y의 순서이다.

민식어는 영어의 순서를 따르기는 하지만, 약간 변형시켜서 따른다. 그리고 ng는 n과 o사이에 오는 하나의 알파벳이다. ng는 무조건 이 알파벳으로 생각한다.

영식이는 사람들이 쉽게 민식어를 배울 수 있도록 민식어 사전을 만들려고 한다. 따라서 몇 개의 단어를 정렬하고자 한다. 민식어 단어가 주어졌을 때, 그것을 민식어의 순서대로 정렬하는 프로그램을 작성하시오.


입력

첫째 줄에 민식어 단어의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄부터 한 줄에 하나씩 단어가 입력으로 들어온다. 단어의 길이는 최대 50자이다. 민식어에 없는 알파벳이 입력으로 주어지는 경우는 없다. 모든 단어는 중복되지 않는다.


출력

첫째 줄부터 차례대로 정렬한 결과를 출력한다.


기존 알파벳은 a b c d e f g h i j k l m n o p q r s t u v w x y z,이고 민식어의 순서는 

 a b k d e g h i l m n ng o p r s t u w y 이다.

 

민식어 단어를 기존 알파벳과 매칭시켰다.{a:a}, {b:b}, {k:c} 이런식으로 {민식어 : 알파벳} 으로 map에 넣어두었다.

그 후, 민식어의 순서대로 새로 단어를 만들고 벡터에 넣어두고 정렬해서 해결할 수 있었다.
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
 
map<string,string> m;
map<string,string>::iterator iter;
vector<pair<string,string>> myv;
 
bool compare(pair<string,string> a,pair<string,string> b){
    return a.second < b.second;
}
 
void init(){
    /* {민식어:알파벳} 매칭으로 맵에 넣어둠 */
 
    m = { {"a", "a"},{"b","b"},{"k","c"},{"d","d"},{"e","e"},{"g","f"},
	{"h","g"},{"i","h"},{"l","i"},{"m","j"},{"n","k"},{"ng","l"},{"o","m"},{"p","n"},
	{"r","o"},{"s","p"},{"t","q"},{"u","r"},{"w","s"},{"y","t"} };
 
 
}
int main(void){
    int t;
    cin >> t;
    init();
 
    for(int i = 0;i<t;i++){
        string str;
        cin >> str;       
        string order = ""; //새로운 단어
 
        for(int i = 0;i<str.size();i++){
            if(str[i] != 'n'){ //'n'일떄를 제외하고 새로운 단어를 만듬
                string temp = "";
                temp = temp + str[i];
                iter = m.find(temp);
                 string new_ = iter->second;
                 order = order.append(new_);
            }
            else if(str[i] == 'n'){
 
                   if(str[i+1] == 'g'){ //"n 다음 g가 나올때 새로운 단어를 만듬"
                    string temp = "";
                    temp = temp + str[i];
                    temp = temp + str[i+1];
                    iter = m.find(temp);
                    string new_ = iter->second;
                    order = order.append(new_);
                    continue;
                }
 
                else if(str[i+1] != 'g'){ //"n 다음 g가 아닐때 새로운 단어를 만듬"
                    string temp = "";
                    temp = temp + str[i];
                    iter = m.find(temp);
                    string new_ = iter->second;
                    order = order.append(new_);
                }
 
 
            }
        }
        myv.push_back({str,order});
 
    }
 
    sort(myv.begin(),myv.end(),compare);
    for(int i = 0;i<myv.size();i++){
        cout << myv[i].first << '\n';
    }
 
 
}
 
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
 
map<string,string> m;
map<string,string>::iterator iter;
vector<pair<string,string>> myv;
 
bool compare(pair<string,string> a,pair<string,string> b){
    return a.second < b.second;
}
 
void init(){
    /* {민식어:알파벳} 매칭으로 맵에 넣어둠 */
 
    m = { {"a", "a"},{"b","b"},{"k","c"},{"d","d"},{"e","e"},{"g","f"},
    {"h","g"},{"i","h"},{"l","i"},{"m","j"},{"n","k"},{"ng","l"},{"o","m"},{"p","n"},
    {"r","o"},{"s","p"},{"t","q"},{"u","r"},{"w","s"},{"y","t"} };
 
 
}
int main(void){
    int t;
    cin >> t;
    init();
 
    for(int i = 0;i<t;i++){
        string str;
        cin >> str;      
        string order = ""; //새로운 단어
 
        for(int i = 0;i<str.size();i++){
            if(str[i] != 'n'){ //'n'일떄를 제외하고 새로운 단어를 만듬
                string temp = "";
                temp = temp + str[i];
                iter = m.find(temp);
                 string new_ = iter->second;
                 order = order.append(new_);
            }
            else if(str[i] == 'n'){
 
                   if(str[i+1] == 'g'){ //"n 다음 g가 나올때 새로운 단어를 만듬"
                    string temp = "";
                    temp = temp + str[i];
                    temp = temp + str[i+1];
                    iter = m.find(temp);
                    string new_ = iter->second;
                    order = order.append(new_);
                    continue;
                }
 
                else if(str[i+1] != 'g'){ //"n 다음 g가 아닐때 새로운 단어를 만듬"
                    string temp = "";
                    temp = temp + str[i];
                    iter = m.find(temp);
                    string new_ = iter->second;
                    order = order.append(new_);
                }
 
 
            }
        }
        myv.push_back({str,order});
 
    }
 
    sort(myv.begin(),myv.end(),compare);
    for(int i = 0;i<myv.size();i++){
        cout << myv[i].first << '\n';
    }
 
 
}

'알고리즘' 카테고리의 다른 글

백준 16953 A->B C++  (0) 2022.07.15
백준 도어맨 5002 C++  (0) 2022.07.15
백준 비슷한 단어 2179 C++  (0) 2022.07.13
백준 11536 줄 세우기 C++  (0) 2022.07.11
백준 9081 단어 맞추기 C++  (0) 2022.07.11