1159번 농구 경기 문제
- 요약하자면 출전하는 선수들 중 첫 글자가 같은 선수들이 5명 이상 있다면 체크해두었다가
- 그 첫 글자들을 공백없이 출력하는 문제임
- 만약 5명 미만이라면 PREDAJA를 출력
먼저 무작정 풀어보기
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
int n = 0;
std::cin >> n;
std::string temp;
int directAddr[128] = {};
for (int i = 0; i < n; i++)
{
std::cin >> temp;
directAddr[temp[0]] += 1;
}
std::vector<char> chVec;
for (int i = 0; i < 128; i++)
{
if (directAddr[i] >= 5)
{
chVec.push_back((char)i);
}
}
if (chVec.empty())
{
std::cout << "PREDAJA";
return 0;
}
else
{
for (char ch : chVec)
std::cout << ch;
}
}
- 이 문제는 얼마 전 학원에서 내준 숙제 중 DirectAddressTable을 이용한 숙제들이 있었는데
- 그걸 이용하니 수월하게 풀렸다.
- ASCII코드로 a~z / A~Z가 0번부터 128번 안에 포함되다 보니 인덱스를 문자로 취급하고 접근시마다 카운팅하는 식
큰돌님의 풀이
#include <iostream>
#include <string>
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';
}
- Direct Address Table을 카운팅 배열이라는 개념으로 풀어서 설명해주셨다.
- 문자의 ASCII를 배열의 인덱스로 사용하는 개념 자체는 동일함
- 다만 입력받은 값에서 'a'를 빼줌으로써 실제로 인덱스를 26까지만 사용할 수 있어서 좀 더 빠르게 동작
PREDAJA같은 문자열의 경우 백준에서 제공하는 출력쪽에서 그대로 긁어와서 사용해야 함
특수문자같은 경우 우리가 아는 특수문자와 미세하게 차이가 있을 수 있기 때문
'자료구조와 알고리즘 > [Inflearn_큰돌] 10주 완성 C++ 코딩테스트' 카테고리의 다른 글
1주차-5. 9996번: 한국이 그리울 땐 서버에 접속하지 (0) | 2022.09.27 |
---|---|
1주차-4. 11655번: ROT13 (1) | 2022.09.26 |
1주차-2. 10988번 팰린드롬인지 확인하기 (2) | 2022.09.13 |
1주차-1. 2979번 트럭 주차, 카운팅 배열에 대한 개념 (0) | 2022.09.12 |
1주차-0. 기초 개념 : 개념 강의 (0) | 2022.09.04 |
댓글