
https://www.acmicpc.net/problem/1316
오늘은 그룹 단어 체커 문제를 풀어봤다.
처음엔 문제 자체는 어렵지 않아 보였는데, 중복 문자가 떨어져 다시 등장할 때를 어떻게 체크할지 고민을 좀 했다.
핵심 로직은 아래 두 가지 조건을 판단하는 것이다:
연속된 문자는 괜찮다. (예: aabbcc)
하지만 한 번 등장하고 떨어졌다가 다시 나오면 그룹 단어가 아니다. (예: abab)
이를 위해 prev라는 변수로 바로 이전 문자를 기억하고,
bool[] seen = new bool[26] 배열로 해당 문자가 한 번이라도 등장했는지 체크했다.
static void Main(string[] args)
{
int inputLength = int.Parse(Console.ReadLine());
int groupWordCount = 0;
for (int i = 0; i < inputLength; i++)
{
string input = Console.ReadLine();
if (IsGroupWord(input))
{
groupWordCount++;
}
}
Console.WriteLine(groupWordCount);
}
static bool IsGroupWord(string word)
{
bool[] seen = new bool[26]; // 알파벳 사용 여부
char prev = '\0'; // 이전 문자
foreach (char c in word)
{
if (c != prev)
{
if (seen[c - 'a']) // 이미 나왔던 문자가 떨어져서 다시 나옴
{
return false;
}
seen[c - 'a'] = true;
}
prev = c;
}
return true; // 그룹 단어임
}
seen[c - 'a']처럼 문자를 인덱스로 바꾸는 게 익숙하지 않아서 처음엔 헷갈렸는데,
알고 보니 'a'의 아스키 값이 97이니까 'c' - 'a'를 하면 알파벳 순서대로 0~25로 바뀌는 것이었다.
이 문제를 통해 foreach 루프, 아스키 코드 계산, 그리고 불린 배열을 통한 방문 체크까지
실전에서 자주 쓸 수 있는 기초 로직을 다시 익힐 수 있었다.