1 분 소요

문제 링크

풀이 과정

  1. 시간 제한이 핵심인 문제이다.
  2. 입출력을 Stream객체를 통해 구현하여 시간을 절약한다.
  3. 배열을 순회하며 값을 비교하여 중복 요소를 찾지 말고 C#에서 제공하는 자료구조를 활용한다.
  4. List든 Set이든 Dictionary든 상관 없지만 여기서는 간단히 HashSet을 이용했다.

HashSet이용

HashSet은 값을 대입할 때 중복 값을 허용하지 않는다.
만약에 집합 S에 중복되는 문자열이 담겨도 HashSet으로 집합 S를 구현하면 중복되는 요소는 무시된다.
그러므로 집합 S에 포함되는 문자열을 찾을 때 중복으로 담긴 요소들로 성능을 낭비하지 않아도 된다.

HashSet<string> S = new HashSet<string>();

S.Add("중복 요소");
S.Add("중복 요소");
S.Add("중복 요소");
S.Add("중복 요소");
S.Add("중복 요소");

foreach (string s in S)
{
    Console.WriteLine(s);   
}
// 출력 결과
// 중복 요소


다음으로 값을 찾을 때는 HashSet이 제공하는 메소드인 Contains를 통해 해당 값을 가지고 있는지를 알 수 있다.

HashSet<string> S = new HashSet<string>();

S.Add("가");
S.Add("나");
S.Add("다");

if(S.Contains("가"))
{
    Console.Write("\"가\" 를 가지고 있다");
}
// 출력 결과
// "가" 를 가지고 있다.

결과

internal class Program
{
    static void Main(string[] args)
    {
        StreamReader sr = new StreamReader(Console.OpenStandardInput());
        StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());

        string[] s = sr.ReadLine().Split(" ");
        int N = int.Parse(s[0]);
        int M = int.Parse(s[1]);

        HashSet<string> S = new HashSet<string>();
        int num = 0;

        for (int i = 0; i < N; i++)
        {
            S.Add(sr.ReadLine());
        }

        for (int i = 0; i < M; i++)
        {
            if(S.Contains(sr.ReadLine()))
            {
                num++;
            }
        }

        sw.Write(num);

        sr.Close();
        sw.Close();
    }
}

댓글남기기