포스트

Pr.1159 농구경기

Pr. 1159 농구경기

문제

상근이는 농구의 세계에서 점차 영향력을 넓혀가고 있다. 처음에 그는 농구 경기를 좋아하는 사람이었다. 농구에 대한 열정은 그를 막을 수 없었고, 결국 상근이는 농구장을 청소하는 일을 시작했다. 상근이도 농구장을 청소하면서 감독이 되기 위해 가져야할 능력을 공부해나갔다. 서당개 3년이면 풍월을 읊듯이 상근이는 점점 감독으로 한 걸음 다가가고 있었다. 어느 날 그에게 지방의 한 프로농구팀을 감독할 기회가 생기게 되었다. 그는 엄청난 지도력을 보여주며 프로 리그에서 우승을 했고, 이제 국가대표팀의 감독이 되었다.</br> 내일은 일본과 국가대표 친선 경기가 있는 날이다. 상근이는 내일 경기에 나설 선발 명단을 작성해야 한다.</br> 국가대표팀의 감독이 된 이후에 상근이는 매우 게을러졌다. 그는 선수의 이름을 기억하지 못하고, 각 선수의 능력도 알지 못한다. 따라서, 누가 선발인지 기억하기 쉽게 하기 위해 성의 첫 글자가 같은 선수 5명을 선발하려고 한다. 만약, 성의 첫 글자가 같은 선수가 5명보다 적다면, 상근이는 내일 있을 친선 경기를 기권하려고 한다.</br> 상근이는 내일 경기를 위해 뽑을 수 있는 성의 첫 글자를 모두 구해보려고 한다.</br>

입력

첫째 줄에 선수의 수 N (1 ≤ N ≤ 150)이 주어진다. 다음 N개 줄에는 각 선수의 성이 주어진다. (성은 알파벳 소문자로만 이루어져 있고, 최대 30글자이다)

출력

상근이가 선수 다섯 명을 선발할 수 없는 경우에는 “PREDAJA” (따옴표 없이)를 출력한다. PREDAJA는 크로아티아어로 항복을 의미한다. 선발할 수 있는 경우에는 가능한 성의 첫 글자를 사전순으로 공백없이 모두 출력한다.

예제 입력

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
18
babic
keksic
boric
bukic
sarmic
balic
kruzic
hrenovkic
beslic
boksic
krafnic
pecivic
klavirkovic
kukumaric
sunkic
kolacic
kovacic
prijestolonasljednikovi

예제 출력

1
bk

풀이과정

전제조건

  1. 시간 복잡도, 공간 복잡도
    • for문을 사용하여 시간 복잡도는 o(n)이다.
  2. 최대, 최소 조건
    • 선수 최대 150명으로 n의 최대값은 150이다.
  3. 사용 알고리즘
    • 단순 구현으로 해결가능
      1. 선수의 수를 입력받는다.
      2. 각 선수의 이름을 입력받는다.
      3. 각 선수의 첫 글자를 카운트한다.
  4. 반례
    • 없음

제출 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<bits/stdc++.h>
using namespace std;

int m, ret[26];
string result;

int main(){
    cin >> m;

    for(int i = 0; i < m; i++){
        string s;
         cin >> s;
         int a = s[0] - 'a';
         ret[a]++;
    }
    result = "";

    for(int i = 0; i < 26; i++){
        if (ret[i] >= 5){
            result += (char)(i + 'a');
        }
    }

    if (result == ""){
        cout << "PREDAJA";
    }
    else{
        cout << result;
    }
    return 0;
}

해설

생각해볼 점

  • 트럭문제와 동일한 누적합 문제이다.
  • 입력값을 받는 동시에 카운팅을 한다.

수정방안

정답 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<bits/stdc++.h>
using namespace std; 
int n, cnt[26]; 
string s, ret; 
int main(){
    cin >> n; 
    for(int i = 0; i < n; i++){
        cin >> s; 
        cnt[s[0] - 'a']++;
    }
    for(int i = 0; i < 26; i++)if(cnt[i] >= 5) ret+=  i + 'a'; 
    if(ret.size()) cout << ret << "\n"; 
    else cout << "PREDAJA" << "\n";
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.