총 N개의 문자열로 이루어진 집합 S가 주어진다.
입력으로 주어지는 M개의 문자열 중에서 집합 S에 포함되어 있는 것이 총 몇 개인지 구하는 프로그램을 작성하시오.
첫째 줄에 문자열의 개수 N과 M (1 ≤ N ≤ 10,000, 1 ≤ M ≤ 10,000)이 주어진다.
다음 N개의 줄에는 집합 S에 포함되어 있는 문자열들이 주어진다.
다음 M개의 줄에는 검사해야 하는 문자열들이 주어진다.
입력으로 주어지는 문자열은 알파벳 소문자로만 이루어져 있으며, 길이는 500을 넘지 않는다. 집합 S에 같은 문자열이 여러 번 주어지는 경우는 없다.
첫째 줄에 M개의 문자열 중에 총 몇 개가 집합 S에 포함되어 있는지 출력한다.
Java 11: 6초
❌ 두 문자열 집합을 주고, 두 번째 집합의 요소들이 첫 번째 집합에 포함되어있는지 찾는 문제로 이전 문제와 동일한 알고리즘이라고 생각해서
add()
메서드를 활용하여false
를 반환하는 경우cnt++
을 수행하도록 코드를 작성하여 제출했는데 오답 처리가 됐다!,,
원인은cnt
가 증가할 수 있는 경우의 수인 것 같다! 첫번째 문자열 집합에 중복되는 값이 있는 경우와, 두 번째 문자열 집합 내에서 중복이 발생하는 경우가 존재한다. 첫번째 경우는 문제가 되지 않지만, 두번째 경우에서 cnt가 증가해버리면정답 + n
이 되어버려서 오답이 된다! 예제는 두번째 집합 내에 중복값이 없어서 정답인 줄 알았는데,, 문제에서 첫번째 집합 S에만 중복값이 없다고 했지 두번째 집합에 중복값이 없다는 말은 없었으므로 중복값이 존재하는 다른 테스트 케이스에서 걸렸을 확률 99%,,
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
Set<String> set = new HashSet<>();
for(int i=0;i<n;i++) {
set.add(br.readLine());
}
int cnt = 0;
for(int i=0;i<m;i++) {
if(!set.add(br.readLine())) cnt++;
}
bw.write(cnt + "");
br.close();
bw.close();
}
}
✅ 사실 해당 데이터가 존재하는지 확인할 수 있는 더 확실한 메서드
contains()
가 있음에도 불구하고,, 왜 전 문제에서 굳이add()
를 썼는지 모르겠다,, 이 글에서 조금만 더 내리면 있었는데,, 아마add()
보고 신나서 그걸 써먹은 것 같다 ㅎ,,
...
for(int i=0;i<m;i++) { // add -> contains
if(set.contains(br.readLine())) cnt++;
}
...