algorithm/problem solving

acmicpc.net 1159번 농구 경기(python, c++)

qkqhxla1 2016. 7. 9. 15:21

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;
}