https://www.acmicpc.net/problem/10815
10815번: 숫자 카드
첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,
www.acmicpc.net
접근 :
- 내가 보유할 카드수 N 을 입력 받음
- N 장의 카드에 해당하는 숫자들을 받음
- 비교할 대상 의 숫자수 M 을 입력 받음
- M 개의 해당하는 숫자들을 받음
- 수 로만 이루어져 있으므로 이진 탐색 방법을 사용
- 이진 탐색을 사용하기 위해 N을 오름차순으로 정렬
- 입력 받은 M 을 한 개씩 꺼내어 N장의 카드들에 있는 수 인지 판별
코드 구현:
import java.io.*;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
// n 입력
int n = Integer.parseInt(br.readLine());
String[] inputs = br.readLine().split(" ");
int[] n_array = new int[n];
// n 카드에 해당하는 숫자들 입력
for (int i = 0; i < n; i++) n_array[i] = Integer.parseInt(inputs[i]);
// 오름차순 정렬
Arrays.sort(n_array);
// m 입력
int m = Integer.parseInt(br.readLine());
inputs = br.readLine().split(" ");
int number = 0;
int low = 0;
int high = n - 1;
int mid;
boolean is_contain = false;
for (int j = 0; j < m; j++) {
low = 0;
high = n - 1;
//m 으로 입력 받은 숫자를 순차적으로 꺼냄
number = Integer.parseInt(inputs[j]);
is_contain = false;
//2진 탐색
while (low <= high) {
mid = (low + high) / 2;
// 탐색 중 일치하는 수를 발견한 경우
if (number == n_array[mid]) {
sb.append(1).append(" ");
is_contain = true;
break;
} else if (number < n_array[mid]) {
high = mid - 1;
} else {
low = mid + 1;
}
}
// 탐색 후 찾는 수가 없는 경우
if (!is_contain) sb.append(0).append(" ");
}
System.out.println(sb);
br.close();
}
}
* 번외 :
- 위의 코드를 map으로 수정 후 성능 비교
- 가독성 및 성능이 향상됨
-map을 사용한 코드
import java.io.*;
import java.util.HashMap;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
// n 입력
int n = Integer.parseInt(br.readLine());
String[] inputs = br.readLine().split(" ");
HashMap<String, Integer> numbers = new HashMap<>();
// n 카드에 해당하는 숫자들 입력
for (int i = 0; i < n; i++) {
numbers.put(inputs[i], 1);
}
// m 입력
int m = Integer.parseInt(br.readLine());
inputs = br.readLine().split(" ");
for (int j = 0; j < m; j++) {
if (numbers.containsKey(inputs[j])) {
//sb.append(numbers.get(inputs[j])).append(" ");
sb.append(1).append(" ");
} else {
sb.append(0).append(" ");
}
}
System.out.println(sb);
br.close();
}
}
'JAVA > Coding Test' 카테고리의 다른 글
[JAVA] 백준 1620 나는야 포켓몬 마스터 이다솜_집합과맵 (0) | 2023.03.03 |
---|---|
[JAVA] 백준 14425 문자열 집합 (0) | 2023.03.02 |
[JAVA] 백준 10870 피보나치 수 5_ 재귀함수 (0) | 2023.03.01 |
[JAVA] 백준 10872 팩토리얼_재귀함수 (0) | 2023.02.28 |
[JAVA] 백준 2798 블랙잭_브루트포스 (0) | 2023.02.28 |