문제 링크 : https://www.acmicpc.net/problem/1316
백준 실버 5 문제 입니다.
내 코드
int _count = int.Parse(Console.ReadLine());
string _input = "";
int _result = _count;
bool _isGroupEnd = false;
bool _isStop = false;
for (int i = 0; i < _count; i++)
{
_input = Console.ReadLine();
for (int k = 0; k < _input.Length; k++)
{
for (int p = k + 1; p < _input.Length; p++)
{
if (_input[k] == _input[p])
{
if (_isGroupEnd == true)
{
_isGroupEnd = false;
_result--;
_isStop = true;
break;
}
}
else
{
_isGroupEnd = true;
}
}
_isGroupEnd = false;
if (_isStop == true)
{
_isStop = false;
break;
}
}
}
Console.WriteLine(_result);
코드 풀이 해석 내용
int _count = int.Parse(Console.ReadLine());
정수를 입력받아 _count 변수에 저장합니다. 이 값은 나중에 문자열의 개수를 의미합니다.
string _input = "";
_input은 각 문자열을 저장합니다.
int _result = _count;
_result는 그룹 단어의 개수를 저장합니다. 초기값으로 _count를 저장합니다.
bool _isGroupEnd = false;
_isGroupEnd는 현재 문자가 조건식을 만족하는가를 확인하기 위해 사용합니다.
bool _isStop = false;
_isStop은 그룹 단어가 아님을 확인 한 이후에 비교하는 조건식을 마무리 하기 위해 사용합니다.
for (int i = 0; i < _count; i++)
{
_input = Console.ReadLine();
...
}
외부 루트가 _count만큼 반복됩니다. 각 반복마다 문자열을 입력 받습니다.
아래의 내부 루트 전체는 문자를 비교하기 위함입니다.
for (int i = 0; i < _count; i++)
{
_input = Console.ReadLine();
for (int k = 0; k < _input.Length; k++)
{
for (int p = k + 1; p < _input.Length; p++)
{
if (_input[k] == _input[p])
{
if (_isGroupEnd == true)
{
_isGroupEnd = false;
_result--;
_isStop = true;
break;
}
}
else
{
_isGroupEnd = true;
}
}
세세하게 뜯어보도록 하겠습니다.
for (int k = 0; k < _input.Length; k++)
{
...
}
문자열의 각 문자를 순회합니다. k는 비교하고자 하는 문자의 인덱스입니다.
이 루프는 문자열의 모든 문자에 대해 반복을 합니다.
for (int p = k + 1; p < _input.Length; p++)
{
...
}
인덱스 k 이후의 값을 비교 하기 위함입니다.
p는 현재 비교하고 싶은 값 k의 다음 인덱스입니다.
if (_input[k] == _input[p])
{
...
}
이 루프는 _input의 k번째 인덱스와 _input의 p번째 인덱스의 값이 같은지를 비교합니다.
if (_isGroupEnd == true)
{
_isGroupEnd = false;
_result--;
_isStop = true;
break;
}
이 루프에서는 _isGroupEnd 가 true인지 확인합니다. true이면 이전의 문자가 연속으로 나타났다는 뜻입니다.
true일 시 false로 바꿉니다. false로 설정하여 그룹의 단어에서 제외합니다. (그룹이 아님을 뜻합니다)
_result 값을 1 감소 시켜 단어의 개수를 줄입니다.
_isStop을 true로 바꾸고 이 루프를 종료합니다.
else
{
_isGroupEnd = true;
}
위의 루프 (인덱스 비교) 가 아닐시에 이 else문을 실행합니다.
이 루프는 조건을 만족하고 있다고 나타내고 있습니다.
_isGroupEnd를 true로 바꾸고 인덱스 비교 루프로 가서 다시 비교를 합니다.
_isGroupEnd = false;
if (_isStop == true)
{
_isStop = false;
break;
}
내부 루트가 끝이 나게 되면 _isGroupEnd를 false로 초기화 시킵니다.
_isStop이 true일 경우 외부 루트를 종료합니다.
Console.WriteLine(_result);
마지막으로 _result값을 출력합니다.
실행 결과
'C#' 카테고리의 다른 글
백준 C# 31403 문제 풀이 (0) | 2024.09.13 |
---|---|
백준 C# 2587 문제 풀이 (0) | 2024.09.13 |
백준 C# 2941 문제 풀이 (0) | 2024.09.12 |
백준 C# 1157 문제 풀이 (0) | 2024.09.11 |
백준 C# 10988 문제 풀이 (0) | 2024.09.11 |