[백준] 10815: 숫자카드

김태하·2023년 3월 12일
1
post-thumbnail

문제


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

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        Map<Integer, Integer> map = new LinkedHashMap<>();
        int N= Integer.parseInt(br.readLine());
        int[] tmp = new int[N];

        st = new StringTokenizer(br.readLine());
        for(int i=0; i<N;i++){
            tmp[i] = Integer.parseInt(st.nextToken());
        }
        int M = Integer.parseInt(br.readLine());
        st = new StringTokenizer(br.readLine());
        for(int i=0; i<M; i++){
            map.put(Integer.parseInt(st.nextToken()), 0);

        }
        for(int i=0; i<N;i++){
            if(map.containsKey(tmp[i]))
                map.replace(tmp[i], 1);
        }

        for (Integer num : map.keySet()) {
            System.out.print(map.get(num) + " ");
        }

    }
}

풀이


타이틀이 집합과 맵이다 보니 Map 인터페이스를 사용하기로 생각했다.

  1. N을 입력받고 N의 크기만큼의 배열을 선언하여 N개의 숫자들을 넣어줬다.
  2. M을 입력받고 각각의 숫자들을 Key로 사용하여 선언되어 있는 Map에 value를 0으로 넣어준다.
  3. 하나하나 돌아가면서 map.containsKey를 이용하여 키 포함 여부를 확인하고 만약 존재한다면 각 키에 해당하는 값을 1로 바꿔준다.
  4. map.get()을 이용하여 하나하나 출력한다.

근데 여기서 문제가 발생하였다.
일반적인 HashMap()을 사용할 경우 key 값들의 순서가 보장이 되지 않는다. 따라서 순서를 보장하는 LinkedHashMap()을 이용하였다.

다른 풀이들을 봐보니 M개의 값들을 key로 사용하지 않고 N개의 숫자들을 Key로 사용하였다.

개선된 풀이


  1. M을 입력받고 각각의 숫자들을 Key로 사용하여 선언되어 있는 Map에 value를 0으로 넣어준다. (사실상 아무 숫자를 넣어도 괜찮다.)
  2. M개의 숫자들을 입력 받는다.
    map.get()을 했을 때 각각의 숫자에 해당하는 Key가 없다면 null이 반환된다.
  3. 만약 null이 아니라면 1을 출력하고 null이라면 0을 출력하게 한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();
        Map<Integer, Integer> map = new HashMap<>();

        int N= Integer.parseInt(br.readLine());

        st = new StringTokenizer(br.readLine());
        for(int i=0; i<N;i++){
            map.put(Integer.parseInt(st.nextToken()), 0);
        }
        int M = Integer.parseInt(br.readLine());
        st = new StringTokenizer(br.readLine());
        for(int i=0; i<M; i++){
            int num = Integer.parseInt(st.nextToken());
            if(map.get(num) != null)
                System.out.print("1 ");
            else
                System.out.print("0 ");
        }

    }
}

배운점

  • LinkedHashMap()을 이용하면 순서를 보장하는 Map을 사용할 수 있다.
  • HashMap()에서 map.get()을 이용하여 존재하지 않는 Key값의 Value를 가져오려 한다면 null이 반환된다.

문제 링크 : 10815번: 숫자카드

0개의 댓글