문제
토토그램(tautogram)이란 모든 단어가 같은 알파벳으로 시작하는 문장이다. 입력된 한 줄의 문장이 토토그램인지 판별하여 Y 또는 N을 출력하는 문제다. *이 입력되면 종료한다.
입력
- 한 줄씩 문장이 주어진다.
*이 입력되면 종료한다.
출력
- 각 문장에 대해 토토그램이면
Y, 아니면N을 출력한다.
예제
| 입력 | 출력 |
|---|---|
Seventy Seven Sheep Safely Grazed | N |
Peter Piper Picked a Peck | N |
Big Brown Bears Bathe By Beaver Brook | Y |
* | (종료) |
풀이
문장을 단어로 분리한 뒤 첫 번째 단어의 첫 글자(소문자 변환)와 모든 단어의 첫 글자를 비교한다.
getline으로 한 줄 읽고,*이면 종료stringstream으로 공백 기준 단어 분리- 첫 번째 단어의 첫 글자를
tolower로 소문자 변환하여 기준 문자 저장 - 나머지 모든 단어의 첫 글자를 소문자 변환 후 기준 문자와 비교
- 하나라도 다르면
N, 모두 같으면Y출력
핵심 아이디어: 대소문자를 tolower로 통일한 후 첫 글자만 비교하면 되므로, 단어 파싱 후 첫 글자 비교가 핵심이다.
코드
#include <iostream>
#include <vector>
#include <sstream>
#include <cctype>
using namespace std;
bool isTautogram(const string &line)
{
vector<string> words;
stringstream ss(line);
string word;
while (ss >> word)
{
words.push_back(word);
}
if (words.empty())
{
return false;
}
char first = tolower(words[0][0]);
for (const auto &w : words)
{
if (tolower(w[0]) != first)
{
return false;
}
}
return true;
}
int main()
{
string line;
while (true)
{
getline(cin, line);
if (line == "*")
{
break;
}
if (isTautogram(line))
{
cout << "Y" << endl;
}
else
{
cout << "N" << endl;
}
}
return 0;
}복잡도
- 시간: O(N) — 문장 내 전체 문자 수 N에 비례
- 공간: O(W) — 단어 수 W만큼 벡터에 저장