숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N
개를 가지고 있다. 정수 M
개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 가지고 있는지 아닌지를 구하는 프로그램을 작성하시오.
첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)
이 주어진다.
둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다. 두 숫자 카드에 같은 수가 적혀있는 경우는 없다.
셋째 줄에는 M(1 ≤ M ≤ 500,000)
이 주어진다.
넷째 줄에는 상근이가 가지고 있는 숫자 카드인지 아닌지를 구해야 할 M
개의 정수가 주어지며, 이 수는 공백으로 구분되어져 있다. 이 수도 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다
첫째 줄에 입력으로 주어진 M
개의 수에 대해서, 각 수가 적힌 숫자 카드를 상근이가 가지고 있으면 1을, 아니면 0을 공백으로 구분해 출력한다.
5
6 3 2 10 -10
8
10 9 -5 2 3 4 5 -10
1 0 0 1 1 0 0 1
-문제를 만든 사람: baekjoon
-문제의 오타를 찾은 사람: cko301, eric00513, lety, mystika
import java.io.*;
import java.util.HashMap;
import java.util.stream.Stream;
public class Code10815 {
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int N=Integer.valueOf(br.readLine());
String line=br.readLine();
int[] card= Stream.of(line.split(" ")).mapToInt(Integer::parseInt).toArray();
int M=Integer.valueOf(br.readLine());
HashMap<Integer,Integer> haveCard=new HashMap<Integer,Integer>();
for(int i=0;i<N;i++){
haveCard.put(card[i],i);
}
String cardline= br.readLine();
int[] ishave= Stream.of(cardline.split(" ")).mapToInt(Integer::parseInt).toArray(); //가지고 있는지 확인
br.close();
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
for(int i=0;i<M;i++){
String temp="";
if(haveCard.containsKey(ishave[i])){
temp=String.valueOf(1);
bw.write(Integer.valueOf(temp)+" ");
}
else{
temp=String.valueOf(0);
bw.write(Integer.valueOf(temp)+" ");
}
}
bw.flush();
bw.close();
}
}
이제는 계속 BufferedReader
과 BufferedWriter
를 사용해야 할 것 같다. Scanner
쓰면 시간초과가 뜬다.
해시맵
을 이용해서 havaCard
에 키 값으로 가지고 있는 카드를 주고, 비교할 카드가 만약 키 값으로 있는지 비교하는 containsKey()
를 사용해서 해결했다.
이진 탐색(Binary Seacrh)
: 정렬되어 있는 리스트에서 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 방식. 배열 내부 데이터가 정렬되어 있어야 한다. 찾으려는 데이터의 수의 절반을 먼저 보고 그것보다 크면 큰쪽의 반을 보고 해서 반복적으로 탐색한다.