본문 바로가기
자료구조와 알고리즘/알고리즘

농구 경기(1159)

by oncerun 2023. 7. 2.
반응형

 

 

문제 요약

 

성의 첫 글자가 같은 선수 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

댓글