[BAEKJOON] 백준 31823: 악질 검거 (C#)

2024. 6. 19. 17:28IT/BaekJoon

문제 링크

https://www.acmicpc.net/problem/31823

 

 

문제

2034년, 국민대학교의 KPSC 동아리는 그 명성이 대단하여 국민대 자체보다도 KPSC가 더 유명해졌다.

이러한 명성 때문에 많은 사람들이 KPSC에 가입하고자 했으나, 동아리의 명성을 유지하기 위해 한정된 인원만 받고 나머지는 모두 탈락시켜 버렸다.

그러나 동아리에 들어온 후 프로그래밍 공부를 소홀히 하며 잠적하는 회원들이 생겨나기 시작했다.

이러한 상황을 목격한 부동아리장은 분노하여 '리버스-스트릭을 이용한 강퇴'라는 새로운 규칙을 도입하기로 했다. 여기서 '리버스-스트릭'이란, 문제를 며칠 연속으로 풀지 않았는지 보여주는 지표를 의미한다. 즉, 총 𝑥일 동안 연속해서 문제를 전혀 풀지 않았다면 '리버스-스트릭' 𝑥일이라고 한다.

부동아리장을 도와 동아리에 들어온 후 잠적하며 동아리 활동을 소홀히 하는 '악질' 회원들을 식별하는 데 도움을 주자!

 

 

입력

  • 첫 번째 줄에는 KPSC 동아리원의 수 𝑁과 일별 활동 기록의 길이 𝑀이 주어진다. (1≤𝑁,𝑀≤200)활동기록은 𝑀개의 문자가 공백으로 구분되어 주어진다. 이중 𝑖번째 문자가 * 라면 𝑖번째 날에 문제를 풀었다는 것을, . 이라면 𝑖번째 날에 문제를 풀지 않았다는 것을 의미한다.
  • 이름은 영어 소문자로만 이루어진 1글자 이상 10글자 이하의 문자열로 주어지며, 이름들 사이에는 중복이 없다.
  • 다음 𝑁개의 줄에는 각 동아리원의 활동 기록과 이름이 공백을 두고 한 줄에 주어진다.

 

 

출력

첫 번째 줄에는 동아리원들의 최장 리버스-스트릭 중 서로 다른 값들의 개수를 출력한다.

다음 줄부터 각 동아리원의 최장 리버스-스트릭과 이름을 입력받은 순서대로 한 줄에 하나씩 출력한다. 여기서, '최장 리버스-스트릭'이란, 총 𝑀일 기간 내에 달성한 '리버스-스트릭' 중 가장 큰 값을 의미한다.

 

 

 

통과한 답안

using System.Text;

namespace _31823
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string[] inputs = Console.ReadLine().Split(' ');
            int N = int.Parse(inputs[0]);
            int M = int.Parse(inputs[1]);
            StringBuilder sb = new StringBuilder();
            HashSet<int> reverseCnt = new HashSet<int>();

            for (int i = 0; i < N; i++)
            {
                string[] reverseStrig = Console.ReadLine().Split(' ').ToArray();
                int maxCnt = 0;
                int nowCnt = 0;
                for (int j = 0; j < reverseStrig.Length - 1; j++)
                {
                    if (reverseStrig[j] == ".")
                    {
                        nowCnt++;
                    }
                    else
                    {
                        nowCnt = 0;
                    }

                    if (nowCnt > maxCnt)
                    {
                        maxCnt = nowCnt;
                    }
                }

                reverseCnt.Add(maxCnt);
                sb.AppendLine($"{maxCnt} {reverseStrig[M]}");
            }

            Console.WriteLine(reverseCnt.Count);
            Console.WriteLine(sb);
        }
    }
}

 

동아리 인원과 활동 기록이 주어진 경우에

활동을 안한 최장 기록들을 구하는 문제이다.

 

우선 최장 리버스-스트릭 중 서로 다른 값들의 개수를 구하기 위해서

중복을 허용하지 않는 자료 구조인 HashSet을 이용했다.

또, StringBuilder를 이용해서 각각의 최장 리버스-스트릭과 이름을 저장한 후에

모든 인원을 순회한 후에 출력하도록 구현하였다.