c# 백준 14425 문자열 집합
풀이 과정
- 시간 제한이 핵심인 문제이다.
- 입출력을 Stream객체를 통해 구현하여 시간을 절약한다.
- 배열을 순회하며 값을 비교하여 중복 요소를 찾지 말고 C#에서 제공하는 자료구조를 활용한다.
- 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();
}
}
댓글남기기