본문 바로가기

Coding Test/Step14. 집합과 맵

[Java] 1단계. 숫자 카드 [10815번]

항해99를 하면서 풀어봤던 문제지만 다시 한 번 풀어보기

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

  • 예제 입력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

  • 문제 접근
    • 입력
      • 첫째 줄 : 숫자 카드의 개수(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으로 공백으로 구분해 출력
  • 문제 해결
    • 상근이가 가진 카드의 숫자들(둘째 줄)을 N번(첫째 줄)만큼 Set에 추가
    • 비교할 숫자 카드(넷째 줄)을 M번 반복하여 Set에 있으면 1, 없으면 0을 StringBuilder에 추가하여 출력
  • 기존 풀이 [메모리 : 136,576KB / 시간 : 848ms]
public static void main(String[] args) throws IOException{
    Set<Integer> numberSet = new HashSet<>();
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringBuilder sb = new StringBuilder();

    int N = Integer.parseInt(br.readLine());
    StringTokenizer st = new StringTokenizer(br.readLine());
    for(int i = 0; i < N; i++){
        numberSet.add(Integer.parseInt(st.nextToken()));
    }

    int M = Integer.parseInt(br.readLine());
    st = new StringTokenizer(br.readLine());
    for(int i = 0; i < M; i++){
        int number = Integer.parseInt(st.nextToken());
        if(numberSet.contains(number))
            sb.append("1").append(" ");
        else
            sb.append("0").append(" ");
    }
    sb.deleteCharAt(sb.length() - 1);

    System.out.println(sb);
}
  • Stream 풀이 [메모리 : 155,908KB / 시간 : 932ms]
public static void main(String[] args) throws IOException{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringBuilder sb = new StringBuilder();

    br.readLine();
    Set<Integer> numberSet = Arrays.stream(br.readLine().split(" "))
            .map(Integer::parseInt)
            .collect(Collectors.toSet());

    br.readLine();
    int[] compare = Arrays.stream(br.readLine().split(" "))
            .mapToInt(Integer::parseInt)
            .toArray();

    Arrays.stream(compare)
            .mapToObj(i -> numberSet.contains(i) ? "1" : "0")
            .forEach(res -> sb.append(res).append(" "));

    System.out.println(sb);
}