첫째 줄에 두 배열의 입력 횟수가 한 줄로 주어진다. (N, M)
두번째 줄부터 N번째 줄 까지 듣지 못한 사람들이 입력된다.
N+1 번째 줄부터 M번째 줄 까지 보지 못한 사람들이 입력된다.
모든 입력은 소문자로 주어지고, 각 배열에는 중복 입력이 허용되지 않는다.
두 배열에 모두 속하는 사람을 찾아 "사전순"으로 출력해준다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
using System.IO;
using System.Text;
using System.Linq;
using System.Reflection.PortableExecutable;
namespace 연습장
{
internal class Program
{
static void Main(string[] args)
{
using var reader = new StreamReader(Console.OpenStandardInput());
using var print = new StreamWriter(Console.OpenStandardOutput());
StringBuilder sb = new StringBuilder();
int[] num = Array.ConvertAll(reader.ReadLine().Split(), int.Parse);
int NS = num[0]; int NH = num[1];
string[] neverSeen = new string[NS];
string[] neverHeard = new string[NH];
for (int i = 0; i < NS; i++)
{
neverSeen[i] = reader.ReadLine();
}
for (int j = 0; j < NH; j++)
{
neverHeard[j] = reader.ReadLine();
} Array.Sort(neverHeard);
HashSet<string> set1 = new HashSet<string>(neverSeen);
int count = 0;
foreach (string a in neverHeard)
{
if (set1.Contains(a))
{
sb.Append(a + "\n");
count++;
}
}
print.WriteLine($"{count}\n" + sb);
}
}
}
|
cs |
지금까지는 string배열에 입력을 받아서 쪼개놓기만 한 후, int형 배열에 넣어주는 방법을 사용했는데,
이제는 입력을 받은 즉시 int형으로 형변환 해서 int형 배열에 저장할 수 있게 되었다.
그리고 두 배열의 내용물을 비교할 때
전수조사 (시간 복잡도 O(n^2)) 혹은 이진 탐색 (시간 복잡도 O(log n)) 을 사용했었는데, 시간 초과가 뜨는 걸 보고 더 좋은 방법이 없을까 싶어서 찾아봤는데, HashSet 을 이용한 방법이 있었다.
이 방식을 사용하면 해시셋에 데이터를 입력하는 시간 O(n)과 데이터를 찾는데 O(1)의 시간만이 걸리기 때문에 시간을 아주 많이 줄일 수 있게 되었다.
'하루 한 접시' 카테고리의 다른 글
[백준] 2839번: 설탕 배달 [C#] (1) | 2024.03.24 |
---|---|
[백준] 1018 체스판 다시 칠하기 [C#] (0) | 2024.03.24 |
[백준] 10816 숫자 카드 2 [C#] (1) | 2024.03.23 |
[백준] 11651번: 좌표 정렬하기 2 [C#] (1) | 2024.03.23 |
[백준] 25305번: 커트라인 [C#] (1) | 2024.03.23 |