숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 몇 개 가지고 있는지 구하는 프로그램을 작성하시오.
첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다.
셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 몇 개 가지고 있는 숫자 카드인지 구해야 할 M개의 정수가 주어지며, 이 수는 공백으로 구분되어져 있다. 이 수도 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다.
첫째 줄에 입력으로 주어진 M개의 수에 대해서, 각 수가 적힌 숫자 카드를 상근이가 몇 개 가지고 있는지를 공백으로 구분해 출력한다.
10
6 3 2 10 10 10 -10 -10 7 3
8
10 9 -5 2 3 4 5 -10
3 0 0 1 2 0 0 2
💡 문제풀이 과정
key-value
형태의 Object를 이용하여 개수를 카운트하기 위해 Map()
함수한 방법과 Object()
를 이용한 풀이를 비교해 봤다.Object
보다는 시간과 메모리 사용 측면에서 ES6문법의 Map()
함수가 더 좋은 결과였다.✅ 답안 #1: Map()
, for … of
를 이용한 풀이
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
const input = require('fs').readFileSync(filePath).toString().trim().split('\n');
const Ncards = input[1].split(' '); // 상근이가 갖고 있는 카드 리스트
const Mcards = input[3].split(' '); // 확인해야 하는 카드 리스트
const result = [];
const map = new Map(); // 카드 소유 여부와 개수를 저장하기 위한 Map 생성
// 상근이가 가지고 있는 카드 숫자와 카드 개수를 map에 저장하기 위한 반복문
for (card of Ncards) {
// map에 상근이의 카드 숫자와 동일한 값이 있다면, 해당 value에 1 더하기
if (map.has(card)) map.set(card, map.get(card) + 1);
// 동일한 값 없다면, 해당 vaule 1로 저장
else map.set(card, 1);
}
// 확인해야 하는 카드 리스트를 탐색하기 위한 반복문
for (card of Mcards) {
// map에 해당 카드있으면 카드 숫자(key)의 개수(value)를 담고, 없으면 0 담기
result.push(map.get(card) || 0);
}
console.log(result.join(' '));
✅ 답안 #2: Object()
, forEach()
를 이용한 풀이
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
const input = require('fs').readFileSync(filePath).toString().trim().split('\n');
const Ncards = input[1].split(' ').map(Number);
const Mcards = input[3].split(' ').map(Number);
const obj = new Object();
const result = [];
Ncards.forEach((v) => {
obj[v] ? obj[v]++ : (obj[v] = 1);
});
Mcards.forEach((v) => {
result.push(obj[v] || 0);
});
console.log(result.join(' '));