[백준] 숫자 카드2(자바)

지수·2021년 8월 12일
0
post-thumbnail

알고리즘 문제 풀이를 블로그에 올리는 이유는 풀이, 코드를 기록하기 위함이니
앞으로 문제를 다 긁어오기보다 링크만 두고 풀이가 잘 보이도록 포스팅 할 예정입니다!

📄 문제

[백준] 숫자 카드2


👩‍💻 풀이

1. 문제 이해

이 문제는 상근이가 가지고 있는 카드 리스트와, 추가로 주어지는 카드 리스트를 비교하여
아래 카드 리스트의 카드를 상근이가 몇 개 가지고 있는지 순서대로 출력하는 문제이다.

예시로 주어진 아래 입력값을 보자.

10				=> 상근이가 가진 키드의 갯수
6 3 2 10 10 10 -10 -10 7 3	=> 상근이가 가지고 있는 카드
8				=> 비교해야하는 카드의 갯수
10 9 -5 2 3 4 5 -10		=> 비교해야하는 카드

10	: 상근이의 카드 중 1039	: 상근이의 카드 중 90-5	: 상근이의 카드 중 -502	: 상근이의 카드 중 213	: 상근이의 카드 중 324	: 상근이의 카드 중 405	: 상근이의 카드 중 50-10	: 상근이의 카드 중 -102개

따라서 출력값은 3 0 0 1 2 0 0 2 가 된다.

2. 배열, 해쉬맵 활용 풀이

  • 상근이가 가지고 있는 카드들을 담을 크기 N의 배열 cards 생성 및 값 삽입
  • 비교해야할 카드값과 해당 카드 보유 장수를 담은 HashMap<비교 카드 값, 보유 장수> 생성
  • 해쉬맵은 정렬되지 않기 때문에, 이후 순서대로 HashMap의 value를 출력하기 위해 순서를 저장할 별도 배열 order 생성
  • checkCards 메소드
    cards에서 값을 하나씩 꺼내서 HashMap의 key 값과 비교하고,
    key 값과 동일하면 해당 key의 value에 1을 더해줌
    배열 order 순서대로 HashMap의 value를 get하여 붙여준 뒤 출력
import java.util.HashMap;
import java.util.StringTokenizer;

public class Solution {

   public static void main(String[] args) throws IOException {
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
       int N = Integer.parseInt(br.readLine());

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

       int M = Integer.parseInt(br.readLine());
       st = new StringTokenizer(br.readLine(), " ");
       HashMap<Integer, Integer> checkList = new HashMap<>();
       // 해쉬맵이 정렬되지 않기 때문에 순서를 저장하기 위해 별도 배열 생성
       int[] order = new int[M];
       for(int i = 0; i < M; i++) {
           order[i] = Integer.parseInt(st.nextToken());
           checkList.put(order[i], 0);
       }

       System.out.println(checkCards(cards, checkList, order));
   }

   public static String checkCards(int[] cards, HashMap<Integer, Integer> checkList, int[] order) {
       for(int card : cards) {
           if(checkList.containsKey(card)) {
               checkList.put(card, checkList.get(card) + 1);
           }
       }

       // checkList 안의 value 순서대로 뽑아서 return
       StringBuilder sb = new StringBuilder();
       for(int number : order) {
           sb.append(checkList.get(number)).append(" ");
       }

       return sb.toString().trim();
   }
}
profile
사부작 사부작

0개의 댓글