농구 경기
다국어
1 초 | 128 MB | 15420 | 8007 | 7043 | 52.279% |
문제
상근이는 농구의 세계에서 점차 영향력을 넓혀가고 있다. 처음에 그는 농구 경기를 좋아하는 사람이었다. 농구에 대한 열정은 그를 막을 수 없었고, 결국 상근이는 농구장을 청소하는 일을 시작했다. 상근이도 농구장을 청소하면서 감독이 되기 위해 가져야할 능력을 공부해나갔다. 서당개 3년이면 풍월을 읊듯이 상근이는 점점 감독으로 한 걸음 다가가고 있었다. 어느 날 그에게 지방의 한 프로농구팀을 감독할 기회가 생기게 되었다. 그는 엄청난 지도력을 보여주며 프로 리그에서 우승을 했고, 이제 국가대표팀의 감독이 되었다.
내일은 일본과 국가대표 친선 경기가 있는 날이다. 상근이는 내일 경기에 나설 선발 명단을 작성해야 한다.
국가대표팀의 감독이 된 이후에 상근이는 매우 게을러졌다. 그는 선수의 이름을 기억하지 못하고, 각 선수의 능력도 알지 못한다. 따라서, 누가 선발인지 기억하기 쉽게 하기 위해 성의 첫 글자가 같은 선수 5명을 선발하려고 한다. 만약, 성의 첫 글자가 같은 선수가 5명보다 적다면, 상근이는 내일 있을 친선 경기를 기권하려고 한다.
상근이는 내일 경기를 위해 뽑을 수 있는 성의 첫 글자를 모두 구해보려고 한다.
입력
첫째 줄에 선수의 수 N (1 ≤ N ≤ 150)이 주어진다. 다음 N개 줄에는 각 선수의 성이 주어진다. (성은 알파벳 소문자로만 이루어져 있고, 최대 30글자이다)
출력
상근이가 선수 다섯 명을 선발할 수 없는 경우에는 "PREDAJA" (따옴표 없이)를 출력한다. PREDAJA는 크로아티아어로 항복을 의미한다. 선발할 수 있는 경우에는 가능한 성의 첫 글자를 사전순으로 공백없이 모두 출력한다.
예제 입력 1 복사
18
babic
keksic
boric
bukic
sarmic
balic
kruzic
hrenovkic
beslic
boksic
krafnic
pecivic
klavirkovic
kukumaric
sunkic
kolacic
kovacic
prijestolonasljednikovi
예제 출력 1 복사
bk
예제 입력 2 복사
6
michael
jordan
lebron
james
kobe
bryant
예제 출력 2 복사
PREDAJA
흐름
틀린 코드
#include <bits/stdc++.h>
using namespace std;
int n;
string str;
int cnt[26]; //알파벳 빈도수 저장
bool f; //flag, 초기값 false
int main(){
//1. 문제 입력받기
cin >> n;
for(int i=0;i<n;i++){
cin >> str;
cnt[str[0]-'a']++; //2. 성의 첫글자 빈도수 저장
}
//3. 빈도수 5이상이면 출력
for(int i=0;i<n;i++) { //❌틀린 부분
if(cnt[i]>=5){
cout << (char)(i+97);
f=1; //5명 이상인 성이 존재한다.
}
}
//4.빈도수 5인 성이 없으면 PREDAJA 출력
if(f==0){
cout << "PREDAJA";
}
}
틀린 이유
- cnt 배열을 순회할때 범위 값이 틀렸다(26번 돌아야하는데 입력값인 n번 돌았다.)
- -> n이 입력 개수의 크기인데 배열 개수의 크기와 헷갈렸다.
- 변수 사용시 변수명만 보고 어림짐작하지않기!
고친 코드
#include <bits/stdc++.h>
using namespace std;
int n;
string str;
int cnt[26]; //알파벳 빈도수 저장
bool f; //flag, 초기값 false
int main(){
//1. 문제 입력받기
cin >> n;
for(int i=0;i<n;i++){
cin >> str;
cnt[str[0]-'a']++; //2. 성의 첫글자 빈도수 저장
}
//3. 빈도수 5이상이면 출력
for(int i=0;i<26;i++) { //⭕고친부분
if(cnt[i]>=5){
cout << (char)(i+97);
f=1; //5명 이상인 성이 존재한다.
}
}
//4.빈도수 5인 성이 없으면 PREDAJA 출력
if(f==0){
cout << "PREDAJA";
}
}
맞았다.
선생님 코드
#include <bits/stdc++.h>
using namespace std;
int n, cnt[26];
string s, ret;
int main(){
//1. 문제 입력
cin >> n;
for(int i=0;i<n;i++){
cin >> s;
cnt[s[0]-'a']++; //카운팅 배열에 +1
}
//2. 5명 이상인 성은 ret에 추가
for(int i=0;i<26;i++){
if(cnt[i]>=5) ret += i+'a';
}
//3. 성이 존재하면 ret 출력, 아니면 PREDAJA
if(ret.size()) cout << ret << "\n";
else cout << "PREDAJA" << "\n";
return 0;
}
포인트
- 수를 세는 counting시에는 맵 또는 배열~ cnt[a-'a'] 생각
- string ↔️ int 자동 형변환
- int cnt[] 배열에서 원소값을 char형 넣어도 c++에서는 int형으로 자동 형변환 ex) cnt['a'] 와 cnt[97]를 같게취급
- string에 int 넣어도 자동 형변환 string s = 97; //'a'와 같음
- string은 char배열, string[1]은 문자 반환(정확히 말하면 &char)
- 문제에서 주어진 문자열을 출력하는 문제는 복사,붙여넣기 하자(실수 방지)
- 존재 여부를 파악할때 flag도 좋지만 size()로 판단이 가능하다. (cnt배열에서는 값의 여부를 if문으로 꼭 한번씩은 파악하자.-모든 값이 0인 배열에 값을 채워넣는 방식이므로)
- 아스키 코드를 직접 사용하여 이용하는 것보다는 문자로 이용하자.(값 실수 방지) ex) char s = 30 + 'a';
실수를 제외하고 로직은 같았으므로 피드백 코드는 없당
'알고리즘 > 알고리즘 문제풀이' 카테고리의 다른 글
9996번: 한국이 그리울 땐 서버에 접속하지 (0) | 2022.12.31 |
---|---|
11655번: ROT13 (0) | 2022.12.31 |
10998번 : 팰린드롬인지 확인하기 (0) | 2022.12.31 |
2979:트럭 주차 (1) | 2022.12.31 |
10808: 알파벳 개수 (0) | 2022.12.30 |