본문 바로가기
자료구조와 알고리즘/[Inflearn_큰돌] 10주 완성 C++ 코딩테스트

1주차-3. 1159번 농구 경기

by 헛둘이 2022. 9. 26.
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같은 문자열의 경우 백준에서 제공하는 출력쪽에서 그대로 긁어와서 사용해야 함
특수문자같은 경우 우리가 아는 특수문자와 미세하게 차이가 있을 수 있기 때문

댓글