숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 몇 개 가지고 있는지 구하는 프로그램을 작성하시오.
O(N*M)
)은 시간 복잡도상 명백한 시간 초과가 예상되었다.HashMap
이 가장 적합한 자료구조라고 생각했다.HashMap
사용 시: O(N)
(카드 정리) + O(M)
(카드 탐색) = O(N + M)
O(N * M)
HashMap
사용 시: 상근이가 가진 카드 중 고유한 숫자의 개수(K)만큼 HashMap
에 데이터가 저장되므로 공간 복잡도는 O(K)
.O(1)
.HashMap
을 사용하는 것이 정답이라고 확신했다.HashMap<Integer, Integer>
타입의 map
을 생성한다. Key
는 숫자 카드의 숫자, Value
는 해당 카드의 개수를 저장한다.BufferedReader
와 StringTokenizer
를 사용해 N개의 숫자 카드를 효율적으로 입력받는다.for
반복문을 N번 실행하면서, 각 숫자 카드(card
)를 map.getOrDefault(card, 0) + 1
로직을 사용해 map
에 빈도수를 기록한다.BufferedReader
로 M을 입력받는다.StringBuilder
를 생성한다.StringTokenizer
를 사용해 M개의 찾고자 하는 숫자들을 입력받는다.for
반복문을 M번 실행하면서, 찾고자 하는 숫자(target
)를 map
에서 직접 조회(map.getOrDefault(target, 0)
)한다.StringBuilder
에 추가하고 공백을 덧붙인다.