[백준-node.js-10816] 숫자 카드 2

이태헌·2023년 6월 10일
0
post-thumbnail

문제

https://www.acmicpc.net/problem/10816

풀이

let input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n')
let [N,M] = [input[0],input[2]] 
let arr1Map = new Map(); 
let arr1 = input[1].split(' ').map((el)=>el) //첫번째 입력 배열
let arr2 = input[3].split(' ').map((el)=>el) //두번째 입력 배열
let answer = [];

arr1.sort((a,b)=>a-b) //첫번째 배열 오름차순으로 정렬
    
for(let x of arr1){
    if(arr1Map.has(x)) arr1Map.set(x,arr1Map.get(x)+1) 
    else arr1Map.set(x,1) // 첫번째 배열을 Map으로 정리하여 원래 있는 값이면 +1 해주고 없으면 1로 넣어줌
}

for(let x of arr2){
    if(arr1Map.has(x)) answer.push(arr1Map.get(x)) 
    else answer.push(0)	//2번째 배열을 순회하면서 첫번째 배열에서 값을 찾아서 answer에 푸쉬
}

console.log(answer.join(' '))

시간복잡도를 나름 고려하여 Map함수 안에 넣었는데 시간이 1708ms가 걸렸다; 💀
이분탐색이나 투포인터 알고리즘으로는 풀 수가 없는 문제인거 같은데.. 다른 방법을 고민해 봐야겠다..

다른 풀이

const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : 'input.txt';
const input = fs.readFileSync(filePath).toString().trim().split('\n');

const hasCard = input[1].split(' ').map(Number);
let docMap = new Map();
hasCard.forEach((v) => {
  if (docMap.has(v)) {
    docMap.set(v, docMap.get(v) + 1);
  } else docMap.set(v, 1);
});

const checkCard = input[3].split(' ').map(Number);

let resultArr = checkCard.map((v) => (docMap.has(v) ? docMap.get(v) : 0));

console.log(resultArr.join(' '));

Map에 넣고 확인하는 과정까지는 같지만 마지막에 두번째 배열을 순회할때 for문을 쓰지않고 map으로 돌려서 그런가 실행 시간이 현저하게 줄어들었다.. 그래서 원래의 코드에서 두번째 배열을 순회할때 forEach문을 써봤지만 수행시간은 크게 차이가 없었는데 첫번째와 두번째 배열을 map함수로 넣을때 Number로 바로 넣으니까 수행시간이 크게 줄었다..

0개의 댓글