

이번 문제는 한 번 등장한 문자가 끊겼다가 다시 등장하면 안 되는 조건을 가진다.
ex) abc는 그룹 단어이지만, abca는 그룹 단어가 아니다.
입력받은 단어를 순회하면서 각 문자의 등장 여부를 체크하고, 이를 통해 그룹 단어인지 판별한다.
이 과정에서 이전 문자를 따로 저장하여, 현재 문자와 비교하면서 문자가 연속해서 등장하는지 여부를 확인한다.
만약 이전에 등장했던 문자가 다시 나타난 경우, 그룹 단어가 아니라고 판단한다.
또한 알파벳은 아스키 코드를 이용해 정수로 변환할 수 있기 때문에, 이를 배열의 인덱스로 활용하여 각 문자의 등장 여부를 관리하도록 구현했다.
//백준 1316 단어 체커
//한번 등장한 문자가 다시 나오면 안된다. ex) abc ->O, abca ->X
int n = int.Parse(Console.ReadLine());
int count = 0;
for(int i = 0; i < n; i++)
{
string inputData = Console.ReadLine();
bool[] alphabetCheck = new bool[26];
bool isGroupWord = true;
//이전 문자
char prevAlphabet = '\0';
foreach(char c in inputData)
{
//이전 문자와 다를 경우
if(c != prevAlphabet)
{
//이미 등장한 알파벳이 있다면 그룹 단어가 아니다.
if (alphabetCheck[c - 'a'])
{
isGroupWord = false;
break;
}
//처음 등장한 문자라면 체크
alphabetCheck[c - 'a'] = true;
}
prevAlphabet = c; //이전 문자 갱신
}
if (isGroupWord)
count++;
}
Console.WriteLine(count);


이번 문제도 해결하고 보니 HashSet을 이용해 구현한 사람들도 꽤 있었다.
//HashSet을 이용한 방법
int n = int.Parse(Console.ReadLine());
int count = 0;
for (int i = 0; i < n; i++)
{
string inputData = Console.ReadLine();
HashSet<char> set = new HashSet<char>();
bool isGroupWord = true;
char prev = '\0';
foreach (char c in inputData)
{
if (c != prev)
{
// 이미 등장했던 문자면 실패
if (set.Contains(c))
{
isGroupWord = false;
break;
}
set.Add(c);
}
prev = c;
}
if (isGroupWord)
count++;
}
Console.WriteLine(count);
HashSet은 중복을 허용하지 않는 자료구조이기 때문에, Contains()를 통해 문자의 등장 여부를 판단하고 처음 등장한 문자라면 Add()를 통해 기록한다.
이미 HashSet에 존재하는 문자가 다시 등장한 경우, 해당 문자는 이전에 등장한 적이 있는 것이므로 그룹 단어의 조건을 만족하지 않게 된다. 또한 이 방법은 아스키 코드를 활용하지 않고도 구현할 수 있어, 보다 직관적인 방식으로 문제를 해결할 수 있다.
'코딩 테스트 > 백준' 카테고리의 다른 글
| 백준 - [단계별로 풀어보기 2차원 배열] 2738 행렬 덧셈 (0) | 2026.03.18 |
|---|---|
| 백준 - [단계별로 풀어보기 심화 1] 25206 너의 평점은 (0) | 2026.03.18 |
| 백준 - [단계별로 풀어보기 심화 1] 2941 크로아티아 알파벳 (0) | 2026.03.17 |
| 백준 - [단계별로 풀어보기 심화 1] 1157 단어 공부 (0) | 2026.03.16 |
| 백준 - [단계별로 풀어보기 심화 1] 2444 별 찍기 -7 (0) | 2026.03.16 |