코딩테스트/BOJ

[BOJ] 10816 숫자카드 2 - JAVA

5월._. 2022. 3. 17.
728x90

1. 문제

 

10816번: 숫자 카드 2

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,

www.acmicpc.net

숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 몇 개 가지고 있는지 구하는 프로그램을 작성하시오.


2. 풀이

배열 활용

  • 숫자의 범위가 -10,000,000부터 10,000,000까지이므로 그 두배+1만큼 배열 크기를 정했다.
  • 입력받은 값+10000000 위치에 접근해서 +1 한다.
  • 찾을 정수가 주어지면 정수+10000000을 해서 인덱스를 찾아 그 값을 출력한다.
import java.io.*;
import java.util.*;

public class BOJ_10816_숫자카드2 {
   public static void main(String[] args) throws IOException {
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      StringTokenizer st;
      StringBuilder sb = new StringBuilder();
      int N = Integer.parseInt(in.readLine());
      int[] cards = new int[20000001];

      st = new StringTokenizer(in.readLine());
      for(int i=0;i<N;i++) cards[Integer.parseInt(st.nextToken())+10000000]++;

      int M = Integer.parseInt(in.readLine());
      st = new StringTokenizer(in.readLine());
      for(int i=0;i<M;i++) sb.append(cards[Integer.parseInt(st.nextToken())+10000000]).append(" ");

      System.out.println(sb);
   }
}

Map 활용

  • 상근이 카드 숫자를 key값, 몇 번 나왔는지 세는 카운트를 value로 삼아 map에 넣는다. 단, 이미 키값이 있을 경우 저장된 카운트+1을 한 뒤 map에 다시 저장한다.
  • 없다면 새로 저장한다. (카운트=1)
  • 검색할 정수를 입력받으면 그 키값으로 접근해 카운트를 출력한다. 
import java.io.*;
import java.util.*;

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

      int n = Integer.parseInt(br.readLine());
      Map<Integer,Integer> cards = new HashMap<>();

      st = new StringTokenizer(br.readLine()," ");
      for(int i=0;i<n;i++) {
         int num = Integer.parseInt(st.nextToken());
         Integer cnt = cards.get(num);
         if(cnt != null) {
            cards.put(num, cnt+1);
         } else {
            cards.put(num, 1);
         }
      }

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

      st = new StringTokenizer(br.readLine()," ");
      for(int i=0;i<m;i++) {
         int num = Integer.parseInt(st.nextToken());
         Integer cnt = cards.get(num);
         if(cnt != null) sb.append(cnt+" ");
         else sb.append("0 ");
      }

      System.out.println(sb);
   }
}

3. 결과

아래가 Map, 위가 배열사용코드다. 메모리와 시간을 맞바꿨다. 취향따라 선택하면 될 것 같다!

댓글