C#

백준 C# 1316 문제 풀이

psb08 2024. 9. 12. 23:46
728x90
반응형

문제 링크 : 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값을 출력합니다.

 

 

실행 결과

실행 결과 1
실행 결과 2

 

 

'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