본문 바로가기
알고리즘/백준

[백준 15904] UCPC는 무엇의 약자일까? (C++)

by fortissimo 2024. 11. 24.

문제


UCPC는 '전국 대학생 프로그래밍 대회 동아리 연합 여름 대회'의 줄임말로 알려져있다. 하지만 이 줄임말이 정확히 어떻게 구성되었는지는 아무도 모른다. UCPC 2018을 준비하던 ntopia는 여러 사람들에게 UCPC가 정확히 무엇의 줄임말인지 물어보았지만, 아무도 정확한 답을 제시해주지 못했다. ntopia가 들은 몇 가지 답을 아래에 적어보았다.

  • Union of Computer Programming Contest club contest
  • Union of Computer Programming contest Club contest
  • Union of Computer Programming contest club Contest
  • Union of Collegiate Programming Contest club contest
  • Union of Collegiate Programming contest Club contest
  • Union of Collegiate Programming contest club Contest
  • University Computer Programming Contest
  • University Computer Programming Club contest
  • University Computer Programming club Contest
  • University Collegiate Programming Contest
  • University CPC
  • ...

ntopia는 이렇게 다양한 답을 듣고는 UCPC가 무엇의 약자인지는 아무도 모른다고 결론내렸다. 적당히 슥삭해서 UCPC를 남길 수 있으면 모두 UCPC의 약자인 것이다!

문자열이 주어지면 이 문자열을 적절히 축약해서 "UCPC"로 만들 수 있는지 확인하는 프로그램을 만들어보자.

축약이라는 것은 문자열에서 임의의 문자들을 제거하는 행동을 뜻한다. 예를 들면, "apple"에서 a와 e를 지워 "ppl"로 만들 수 있고, "University Computer Programming Contest"에서 공백과 소문자를 모두 지워 "UCPC"로 만들 수 있다.

문자열을 비교할 때는 대소문자를 구분해 정확히 비교한다. 예를 들어 "UCPC"와 "UCpC"는 다른 문자열이다. 따라서 "University Computer programming Contest"를 "UCPC"로 축약할 수 있는 방법은 없다.

그나저나 UCPC는 정말 무엇의 약자였을까? 정확히 아시는 분은 제보 부탁드립니다.

 

입력


첫 번째 줄에 알파벳 대소문자, 공백으로 구성된 문자열이 주어진다. 문자열의 길이는 최대 1,000자이다. 문자열의 맨 앞과 맨 끝에 공백이 있는 경우는 없고, 공백이 연속해서 2번 이상 주어지는 경우도 없다.

 

출력


첫 번째 줄에 입력으로 주어진 문자열을 적절히 축약해 "UCPC"로 만들 수 있으면 "I love UCPC"를 출력하고, 만들 수 없으면 "I hate UCPC"를 출력한다.

 

문제 풀이


그리디 문제.

 

문자의 위치에 상관없이 어떤 문자든 지울 수 있으므로, 앞에 어떤 문자들를 지워 UC까지 만들었는데 또 U가 나온다고 해도 지워버리면 되므로 이전에 등장한 문자의 영향을 받지 않는다. 따라서 문자열의 처음부터 끝까지 탐색하며 U -> C -> P -> C 순서대로 있는지만 확인하면 된다. 이 4개의 문자 사이에 문자가 끼어 있어도 상관없다.

 

문자열이 띄어쓰기가 포함되어 주어질 수 있으므로 cin >>으로 입력을 받는 것이 아니라 getline(cin, string str)을 사용하여 입력받는다.

 

아래는 코드.

더보기
#include <iostream>
#include <string>
using namespace std;

int main()
{
	cin.tie(NULL);
	ios::sync_with_stdio(false);

	string str;
	string findStr = "UCPC";
	int index = 0;
	getline(cin, str);
	for (int i = 0; i < str.length(); i++)
	{
		if (str[i] == findStr[index])
		{
			index++;
			if (index == findStr.length())
			{
				break;
			}
		}
	}
	if (index == findStr.length())
	{
		cout << "I love UCPC" << "\n";
	}
	else
	{
		cout << "I hate UCPC" << "\n";
	}
	return 0;
}

'알고리즘 > 백준' 카테고리의 다른 글

[백준 1497] 기타콘서트 (C++)  (0) 2024.11.26
[백준 2828] 사과 담기 게임 (C++)  (0) 2024.11.25
[백준 16500] 문자열 판별 (C++)  (0) 2024.11.23
[백준 4963] 섬의 개수 (C++)  (0) 2024.11.22
[백준 14620] 꽃길 (C++)  (0) 2024.11.21