1764번: 듣보잡
첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다.
www.acmicpc.net
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception{
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());
String[] nolisten = new String[n];
String[] nosee = new String[m];
for(int i=0; i<n; i++){
nolisten[i] = br.readLine();
}
Arrays.sort(nolisten);
for(int i=0; i<m; i++){
nosee[i] = br.readLine();
}
Arrays.sort(nosee);
int cnt = 0;
StringBuilder sb = new StringBuilder();
for(int i=0; i< nolisten.length; i++){
if(check(nolisten[i], nosee)){
cnt++;
sb.append(nolisten[i]).append('\n');
}
}
System.out.println(cnt);
System.out.print(sb);
br.close();
}
private static boolean check(String str, String[] nosee){
int min = 0;
int max = nosee.length-1;
int middle;
while(min<=max){
middle = (min+max)/2;
if(str.equals(nosee[middle]))
return true;
if(str.compareTo(nosee[middle])<0)
max = middle-1;
else
min = middle+1;
}
return false;
}
}
nolisten[] 원소가 nosee[] 에 포함되어 있는지를 하나씩 확인해야 한다.
즉 nosee[]에서 nolisten[]원소를 찾는 것과 같고, 이를 이분탐색으로 구현했다.
1. 듣보잡의 명단을 '사전순으로' 출력해야 되기 때문에, nolisten[]과 nosee[]를 미리 정렬해주었다.
2. nolisten[] 원소를 하나씩 check()함수를 통해 nosee[]에 속해있는지 찾는다. == 이분탐색
true리턴 == nosee[]에 포함되어 있다는 것으로, cnt++, sb에 append()해주었다.
- check()함수 과정 (이분탐색)
1) nosee[]의 모든 원소를 대상으로 str이 포함되어 있는지를 찾는 것이다.
2) 그러므로 범위는 - nosee[]의 인덱스를 기준으로 설정한다.
최소값=0, 최대값=nosee.length-1
3) str.compareTo() > 0 이면, b>a인 경우와 같다. 그러므로 범위의 최소값을 middle+1로 수정
str.compareTo() < 0 이면, a<b인 경우와 같다. 그러므로 범위의 최대값을 middle-1로 수정
string.compareTo()
- 스트링의 앞 자리부터 하나씩 비교해서 - 리턴
- 리턴값 : int형 값
① 0 : abc == abc
② 양수 : zab > aab
③ 음수 : aab < zab
'1d-1c > BOJ' 카테고리의 다른 글
1934_최소공배수 (JAVA) (0) | 2020.11.22 |
---|---|
1652_누울 자리를 찾아라 (JAVA) (0) | 2020.11.19 |
1759_암호 만들기 (JAVA) (0) | 2020.11.18 |
2309_일곱 난쟁이 (JAVA) (0) | 2020.11.18 |
7562_나이트의 이동 (JAVA) (0) | 2020.11.18 |