[백준] 10815

당당·2023년 4월 30일
0

백준

목록 보기
71/179

https://www.acmicpc.net/problem/10815

📔문제

숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 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을 공백으로 구분해 출력한다.


📝예제 입력 1

5
6 3 2 10 -10
8
10 9 -5 2 3 4 5 -10

📺예제 출력 1

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();
    }
}

📰출력 결과


📂고찰

이제는 계속 BufferedReaderBufferedWriter를 사용해야 할 것 같다. Scanner 쓰면 시간초과가 뜬다.
해시맵을 이용해서 havaCard에 키 값으로 가지고 있는 카드를 주고, 비교할 카드가 만약 키 값으로 있는지 비교하는 containsKey()를 사용해서 해결했다.

❓이분 탐색/이진 탐색

https://velog.io/@kimdukbae/이분-탐색-이진-탐색-Binary-Search

이진 탐색(Binary Seacrh) : 정렬되어 있는 리스트에서 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 방식. 배열 내부 데이터가 정렬되어 있어야 한다. 찾으려는 데이터의 수의 절반을 먼저 보고 그것보다 크면 큰쪽의 반을 보고 해서 반복적으로 탐색한다.

profile
MySQL DBA 신입 지원

0개의 댓글