https://www.acmicpc.net/problem/14425
문제
총 N개의 문자열로 이루어진 집합 S가 주어진다.
입력으로 주어지는 M개의 문자열 중에서 집합 S에 포함되어 있는 것이 총 몇 개인지 구하는 프로그램을 작성하시오.
접근 과정 / 풀이 과정
집합과 맵이라는 카테고리답게 바로 집합에 관련한 문제가 나왔다.
HashSet을 이용하여 어렵지 않게 풀이에 성공하였다.
public static void main(String[] args) throws Exception{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer( bf.readLine() , " ");
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
HashSet<String> set = new HashSet<>();
int count = 0;
for( int i = 0; i < N; i++)
set.add(bf.readLine());
for( int i = 0; i < M; i++) {
if(set.contains(bf.readLine()))
count++;
}
bw.write(count+"");
bw.flush();
}
}
HashSet에 N개의 단어를 넣는다. 입력으로 주어지는 M개의 문자열과 N개의 단어로 이루어진 집합을 대조해야한다.
HashSet에 내장되어 있는 contains() 메소드를 이용하여 집합에 입력 문자열이 포함되어 있는지 확인하고 만약 있다면, 카운트를 1개씩 증가시킨다.
카운트는 곧 M개의 입력값 중 집합에 포함되어 있는 문자열 개수이므로 count를 출력시킨다.
느낀점
public static void main(String[] args) throws Exception{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer( bf.readLine() , " ");
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
String[] set = new String[N+M];
int index = N;
for(int i=0; i<N; i++)
set[i] = bf.readLine();
for(int i=N; i<=M+N-1; i++) {
boolean result = false;
String temp = bf.readLine();
for(int j=0; j<N; j++) {
if(set[j].equals(temp))
result = true;
}
if( result )
set[index++] = temp;
}
bw.write(index-N+"");
bw.flush();
}
위와 같이 HashSet 또는 HashMap 내장 클래스를 이용하지 않고도 풀어보았었는데, 채점 시간이 2700ms로 터무니 없이 높게 나왔다.
자료구조와 잘만든 함수가 얼마나 중요한지 계속 깨닫는 것 같다.