코딩테스트

9. 숫자 카드 2

DEV-HJ 2024. 5. 12. 19:34
반응형

 

이번 문제는 HashMap을 사용하여 푸는 문제였다.

package com.company; // 주의

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();

        int sangNum = Integer.parseInt(br.readLine());
        HashMap<Integer, Integer> card = new HashMap<Integer, Integer>();

        StringTokenizer st = new StringTokenizer(br.readLine());

        for(int i = 0; i < sangNum; i++) {
            int inputNum = Integer.parseInt(st.nextToken());
            
            if(card.containsKey(inputNum)) {
                int count = card.get(inputNum);            
                card.put(inputNum, count + 1);
            } else {
                card.put(inputNum, 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());
            if(card.containsKey(num)) sb.append(card.get(num)).append(" ");
            else sb.append(0).append(" ");
        }
        System.out.println(sb);

    }
}

문제와 구현을 너무 복잡하게 생각했어서 애먹었다. 이해도 안됐었고

단순하게 생각해 볼 필요가 있다. 다른 예제들을 참고하여 풀었다.

 

for문안에서만 결과값을 찍어야 한다는 편견을 버리고 StringBuilder 사용해서 하나의 문자열을 출력했다.

for문안에서 숫자만큼 사용자에게 입력받는단 편견을 버리고 StringTokenizer로 한줄로 공백 기준으로 구분해서 입력 받았다.

 

map에 입력받은 데이터들을 모두 그대로 넣는게 아니라

1, 1, 2, 3, 4, 5, 6, 7, 8 을 입력 받았으면

처음엔 1, 1 이렇게 key, value로 map에 put하고

다음엔 containsKey 메서드를 이용하여 이미 1이라는 key가 있을땐

기존 value에서 +1 한 후 put 하여서 입력받은 숫자가 중복일시 중복 갯수만큼 더해지게 했다. 

HashMap은 중복 key를 허용하지 않기 때문에 중복 key가 있을경우 마지막에 put 해진 key로 대체 되기 때문에 가능하다.

이것은 HashMap의 특성 중 하나이며, 키는 중복되지 않으며 유일해야 한다는 원칙에 따라 동작한다.

 

 

반응형