백준 10816번: 숫자 카드 2

kgh128·2023년 1월 31일

코드: https://github.com/kgh128/Problem-Solving/blob/main/src/Baekjoon/p10816.java


1. 상근이가 소유한 카드 정리

  • key: 카드 번호
  • value: 해당 숫자 카드의 개수

HashMap을 이용해서 상근이가 가지고 있는 카드를 정리한다. 주요하게 사용하는 메소드는 getOrDefault(Object key, Object defaultValue)이다. 이 메소드는 찾는 key가 존재한다면 key의 value를 반환하고, 없거나 null이면 defaultValue를 반환한다. 따라서 이미 ownCards에 존재하는 카드이면 해당 숫자 카드의 개수 + 1을 다시 저장하고, 없는 카드이면 defaultValue인 0 + 1을 저장한다.

HashMap<Integer, Integer> ownCards = new HashMap<>(N);

for (int i = 0; i < N; i++) {
	int card = Integer.parseInt(inputs[i]);
	ownCards.put(card, ownCards.getOrDefault(card, 0) + 1);
}

2. 카드 개수 검색하기

주어진 카드를 ownCards에 검색해서 상근이가 해당 카드를 몇 개 가지고 있는지 구한다. 이때도 getOrDefault()를 사용한다.

for (String givenCard: givenCards) {
	int card = Integer.parseInt(givenCard);
	bw.append(ownCards.getOrDefault(card, 0)).append(' ');
}

[다른 풀이]

HashMap을 사용하지 않고 배열과 인덱스를 사용하여 푸는 방법이 있다. 백준에서 다른 사람의 풀이를 봤을 떄 해당 풀이가 가장 빠른 것 같았다.

숫자 카드의 범위가 -10,000,000 ~ 10,000,000이므로 크기가 20,000,001인 int 배열을 만든다.숫자 카드에 적힌 수를 해당 배열의 인덱스로 사용한다.

  • index: 카드 번호 + 10,000,000 (음수는 바로 인덱스로 사용하지 못하므로 더해준다.)
  • arr[index]: 해당 숫자 카드의 개수

상근이가 소유한 카드를 정리할 때는 arr[index]++를 해주고, 카드 개수를 검색할 때는 arr[index]를 출력한다.

이런 식으로 전체 가능한 경우의 수 만큼 배열을 만들고, 순차적 접근보다는 특별한 의미를 가진 수를 인덱스로 지정하여 접근하는 방법은 많이 쓰인다. 익혀놓자.

인덱스가 key, 원소의 값이 value라고 생각하면 될 것 같다.

0개의 댓글