https://www.acmicpc.net/problem/1159
문제
국가대표팀의 감독이 된 이후에 상근이는 매우 게을러졌다. 그는 선수의 이름도 기억하지 못하고, 각 선수가 능력을 알지 못한다. 따라서, 누가 선발인지 기억하기 쉽게 하기 위해 성의 첫 글자가 같은 선수 5명을 선발하려고 한다. 만약, 성의 첫 글자가 같은 선수가 5명보다 적다면, 상근이는 내일 있을 친선 경기를 기권하려고 한다.
상근이는 내일 경기를 위해 뽑을 수 있는 성의 첫 글자를 모두 구해보려고 한다.
입력
첫째 줄에 선수의 수 N (1 ≤ N ≤ 150)이 주어진다. 다음 N개 줄에는 각 선수의 성이 주어진다. (성은 알파벳 소문자로만 이루어져 있고, 최대 30글자이다)
출력
상근이가 선수 다섯 명을 선발할 수 없는 경우에는 "PREDAJA"를 출력한다. PREDAJA는 크로아티아어로 항복을 의미한다. 선발할 수 있는 경우에는 가능한 성의 첫 글자를 사전순으로 공백없이 모두 출력한다.
쉬워서 따로 설명은 안쓴다.
파이썬 코드
name = [raw_input()[0] for i in range(int(raw_input()))] name = dict([[last,name.count(last)] for last in list(set(name)) if name.count(last)>=5]) print ''.join(sorted(name.keys())) if len(name)>=1 else 'PREDAJA'
c++. c++에서의 딕셔너리는 어떻게 쓰나 하고 찾느라 힘들었다......
오늘 처음써봤는데 사실 효율적으로 맞게 쓴건지도 모르겠다.
#include <iostream> #include <string> #include <map> using namespace std; int main() { string *name; int n; map<string,string> dict; cin>>n; name = new string[n]; for(int i=0;i<n;i++) { cin>>name[i]; map<string, string>::iterator it = dict.find(string(1, name[i][0])); if(it == dict.end()) dict[string(1,name[i][0])] = '0'; else dict[string(1,name[i][0])] += '0'; } int check = true; for(map<string,string>::const_iterator it = dict.begin(); it != dict.end(); ++it) { if(it->second.length() >= 5) { std::cout << it->first; check = false; } } if(check) cout<<"PREDAJA"; return 0; }
'algorithm > problem solving' 카테고리의 다른 글
acmicpc.net 1233번 주사위, 1247번 부호 (0) | 2016.07.10 |
---|---|
acmicpc.net 1292번 쉽게 푸는 문제, 1269번 대칭 차집합 (0) | 2016.07.10 |
acmicpc.net 1120 문자열(c++) (0) | 2016.07.01 |
acmicpc.net 1037번 약수, 1076번 저항, 1100 하얀 칸 (0) | 2016.06.26 |
acmicpc.net 1008번 A/B (0) | 2016.06.25 |