[백준] 1764 듣보잡
단순하게 선형비교해주면 시간초과 뜬다 (나는 항상 이래.. ㅎ)
그래서 애초에 그냥 리스트 두개 만들어서 사전순으로 정렬 해준 뒤에
비교하면서 인덱스를 이동시켜주면서 비교하면 O(N)으로 해결 가능하다
import java.util.*;
import java.io.*;
public class Main{
public static void main(String []args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
// 듣지 못한 리스트 담을 변수
List<String> list1 = new ArrayList<>();
// 보지 못한 리스트 담을 변수
List<String> list2 = new ArrayList<>();
// 잘 담아줍니다
for(int i = 0 ; i < n ; i++ ){
list1.add(br.readLine());
}
for(int i = 0 ; i < m ; i++ ){
list2.add(br.readLine());
}
// 사전순으로 배열하기
Collections.sort(list1);
Collections.sort(list2);
// 갯수도 출력하라고 해서 필요해진 변수
int cnt = 0;
// 스트링은 여기에 담을 예정
StringBuilder sb = new StringBuilder();
// 둘다 스타트는 0번부터~
int idx1 = 0;
int idx2 = 0;
while(idx1 < n && idx2 < m){
String s1 = list1.get(idx1);
String s2 = list2.get(idx2);
// compareTo 메서드는 s1 이 s2보다 사전순으로 뒤일 경우 양수를 반환한다. 앞이면 음수, 같으면 0 반환
int res = s1.compareTo(s2);
if(res==0){
cnt++;
sb.append(list1.get(idx1) + "\n");
idx1++;
idx2++;
}else if(res>0){
idx2++;
}else{
idx1++;
}
}
System.out.println(cnt + "\n" + sb);
}
}
Comments