반응형
문제 요약
성의 첫 글자가 같은 선수 5명을 선발. 만약 성의 첫 글자가 같은 선수가 5명보다 적다면, 기권.
뽑을 수 있는 성의 첫 글자를 모두 구하기.
입력
선수의 수 : N (1 <= N <= 150)
N개의 줄의 각 선수의 성 ( 알파벳 소문자, 최대 30글자)
출력
5명보다 적은 경우 "PREDAJA" 문자열 출력
5명이 충족되는 경우 성의 첫 글자를 사전순으로 공백 없이 모두 출력
풀이
입력의 첫 글자만 추출하여 카운팅을 하며, 조건에 따라 출력이 정해진다.
즉, 해당 문제는 카운팅을 하는 문제이다.
알파벳 소문자이기 때문에 아스키 코드로 변환이 가능하며, 이는 배열로 처리하여 카운팅을 해도 된다.
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> names(26, 0);
vector<char> result;
for(int i=0; i < n; i++){
string name;
cin >> name;
char lastName = name[0];
names[lastName - 'a']++;
}
for(int i=0; i<26; i++){
if(names[i] >= 5){
result.push_back(i + 'a');
}
}
if(result.empty()){
cout << "PREDAJA" << '\n';
}else{
for(char a : result) cout << a;
cout << '\n';
}
return 0;
}
26의 크기를 가지도록 한 이유는 성의 첫 글자가 알파벳이기 때문이다.
별로의 정렬을 하지 않은 이유는 a 부터 순환을 하여 vector에 넣고 출력 시 앞에서부터 pop 하는데, Queue와 같은 구조라고 생각했기 때문이다.
이제 다른 풀이를 보고 내 코드를 고쳐보자.
#include <bits/stdc++.h>
using namespace std;
int n, names[26];
string name, result;
int main() {
cin >> n;
for(int i=0; i < n; i++){
cin >> name;
names[name[0] - 'a']++;
}
for(int i=0; i<26; i++){
if(names[i] >= 5){
result += (i + 'a');
}
}
if(result.empty())
cout << "PREDAJA" << '\n';
else
cout << result << '\n';
return 0;
}
문제를 해결하기 위한 개념은 동일하되, 변수의 사용을 많이 줄인 것을 알 수 있다.
반응형
'자료구조와 알고리즘 > 알고리즘' 카테고리의 다른 글
9996 (0) | 2023.07.04 |
---|---|
ROT13(11655) (0) | 2023.07.02 |
Palindrome (0) | 2023.07.02 |
트럭 주차 (0) | 2023.07.01 |
문자열 카운팅. (0) | 2023.07.01 |
댓글