* 해당 문제 풀이는 '큰돌'님의 문제풀이에서 제가 이해한 부분을 재작성한것입니다
백준 1159 농구 경기 입니다
문제 해석
농구 경기 문제를 해석해보겠습니다
문제의 지문이 조금 길수도 있지만 핵심만 파악을 해보겠습니다
우선 상근이는 국가대표팀의 감독이 된 이후에 매우 게을러졌습니다, 게을려졌기때문에 선수의 이름도 모르고, 능력도 모르기때문에, 어떤 농구 선수가 선발되어있는 기억하기 쉽게 성의 첫글자가 같은 선수 5명을 선발하고, 성의 첫글자가 같은 선수가 5명보다 적다면 경기를 기권할려고 하고있습니다
입력을 보게 되면 우선 선수의 수(N)이 주어지고 다음줄부터 N만큼 선수의 성이 문자열로 주어집니다
여기서 입력된 문자열에 가장 앞글자에 있는 알파벳을 가져와서 카운팅을 하면됩니다
즉 a가 몇개, b가 몇개, c가 몇개 ... 카운팅을 하고, 해당 카운팅이 5개이상인 알파벳을 출력해주면됩니다
여기서 문제는 알파벳 카운팅을 어떻게 하냐입니다
알파벳같은경우는 아스키 코드로 변환을 하면 정수값이 나오게 됩니다
A = 65, a = 97 와 같이 각 문자별로 고유한 정수값이 있습니다 해당 정수값을 가져온다음에 배열에 인덱스랑 매칭시켜준다음 카운팅을 하면 됩니다
하지만 배열을 보통 인덱스가 0부터 시작하게 됩니다, 즉 배열에 시작은 0 이지만 알파벳에 시작인 a의 정수값은 97입니다
그러면 불필요한 97개의 배열의 요소들이 만들어지게 됩니다
그렇기에 아스키 코드로 변환한 정수값을 - 97(a의 아스키 코드) 해준다음에 인덱스와 매칭시켜줍니다
즉 arr[(아스키 코드) - 97)] 이 되는 구조입니다
캡쳐본이 짤리긴 했지만 만약에 5개가 넘은 알파벳이 없을경우 아래와 같이 "PREDAJA" 문자열을 출력하면됩니다
문제 풀이 순서
1. 정수 N과 알파벳 카운팅 배열, 최종 결과를 체크하는 변수, 각 선수의 성을 받을 문자열 변수를 선언합니다
2. 선수의 수인 N을 입력 받습니다
3. N만큼 반복문을돌려 반복물이 돌때마다 선수의 성을 입력받습니다
4. 성의 앞글자를 가져온다음에 아스키 코드로 변환후 (아스키코드-97) 한후, 카운팅배열 인덱스에 매칭을 하여 카운팅을 합니다
5. N의 순회가 다끝나면 다시 알파벳 갯수 만큼 순회를 합니다
6. 이때 카운팅이 5이상인 알파벳을 출력하고, 최종 결과 변수를 +1 해줍니다
5. 만약 최종 결과 변수가 0일때 "PREDAJA" 출력합니다
작성 코드
#include<bits/stdc++.h>
using namespace std;
//선수의수,카운티배열,최종결과 체크 선언
int n, arr[26],ret;
//선수의 성 선언
string temp;
int main(){
cin >> n;
//n번만큼 반복하면서 카운팅배열에 인덱스에 맞는 값 +1
for(int i = 0; i < n; i++){
cin >> temp;
//카운팅 배열이 0부터 시작하는 아스키 코드 a(97) 빼기
arr[temp[0] - 'a']++;
}
//카운팅 배열 순회
for(int i = 0; i < 26; i++){
//값이 5이상이면 해당 인덱스를 문자로 바꿔서 출력
if(arr[i] >= 5){
char t = (char) i + 97;
cout << t << "";
ret++;
}
}
//아무것도 없을때 출력
if(ret == 0){
cout << "PREDAJA" << "\n";
}
return 0;
}
'코딩테스트' 카테고리의 다른 글
백준 9375 패션왕 신해빈(C++) (1) | 2022.11.20 |
---|---|
백준 1620 나는야 포멧몬 마스터 이다솜(C++) (1) | 2022.11.19 |
백준 2559 수열(C++) (0) | 2022.11.17 |
백준 2979 트럭주차(C++) (1) | 2022.11.13 |
백준 2309 일곱난쟁이 (C++) (0) | 2022.11.12 |