백준-Node.js-10816, 숫자 카드 2

송철진·2023년 3월 3일
0

백준-Node.js

목록 보기
44/71
post-custom-banner

풀이1(시간 초과⏰)

const fs = require('fs')
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n')

const n = input[1].split(' ')
const m = input[3].split(' ')

const solution = (n, m) => {
  let result = Array(m.length).fill(0)
  m.forEach((el1,i) => 
   n.forEach((el2,j) => {
    if(el1 === el2) result[i] += 1
   })
  )
  return result.join(' ')
}

console.log(solution(n, m))

forEach()를 사용하여 이중반복문으로 구현했다.
1%에서 멈추더니 시간초과가 발생했다.

풀이2(시간 초과⏰)

const fs = require('fs')
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n')

const n = input[1].split(' ')
const m = input[3].split(' ')

const solution = (n, m) => {
  let result = []
  for(let el1 of m){
    let count = 0
    for(let el2 of n){
      if(el1 === el2) count++
    }
    result.push(count)
  }
  return result.join(' ')
}

console.log(solution(n, m))

풀이1과 동일한 로직을 for문으로 구현해보았다.
3%에서 멈추더니 여전히 시간초과가 발생했다.

풀이3(성공....)

참조: https://velog.io/@pletis/백준-10816번-숫자-카드2Node.jsJavaScript

const fs = require('fs')
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n')
// const input = ['10',
// '6 3 2 10 10 10 -10 -10 7 3',
// '8',
// '10 9 -5 2 3 4 5 -10']
const n = input[1].split(' ')
const m = input[3].split(' ')

const solution = (n, m ) => {
  let result = [];
  let resultMap = new Map();
  for (el1 of n) {
    if (resultMap.has(el1))
      resultMap.set(el1, resultMap.get(el1) + 1);
    else resultMap.set(el1, 1);
  }

  for (el2 of m) {
    if (resultMap.has(el2)) result.push(resultMap.get(el2));
    else result.push(0);
  }
  return result.join(' ')
}

console.log(solution(n, m))

먼저 n에 대해 for문으로 순회하여 전역객체 resultMap에 요소 el1이
있으면 +1 하고 없으면 1 할당한다
순회를 마치고 resultMap의 값은 다음과 같다.

그다음 m에 대해 for문으로 순회하여 resultMap에 요소 el2가
있으면 el2를 키로 갖는 값을, 없으면 0을 result에 push()한다.

전역 객체 Map

  • 객체는 키-값 쌍과 키의 원래 삽입 순서를 기억합니다.

풀이4(시간 초과⏰)

const input = ['10',
'6 3 2 10 10 10 -10 -10 7 3',
'8',
'10 9 -5 2 3 4 5 -10']

const n = input[1].split(' ')
const m = input[3].split(' ')

const solution = (n, m) => {
  let result = [];
  const count = n.reduce( (ac,v) => ({...ac, [v] : ( ac[v] || 0 ) + 1 }), 0)  
  
  m.forEach(el => result.push(count[el] || 0))
  return result.join(' ')
}

console.log(solution(n, m))

배열 n의 요소-개수 쌍을 갖는 객체 count를 선언하고
배열 m의 요소에 대해 순회하여 count에 값이 있으면 result에 그 값을 넣고 없으면 result에 0을 넣는다.

👉 n과 m을 일대일로 비교했던 풀이1,2와 달리
풀이 3처럼 중복요소의 개수를 먼저 확인함으로써
로직을 단순화시켰다고 생각했는데 여전히 시간초과가 발생했다.
아마도 reduce() 때문이 아닐까.

profile
검색하고 기록하며 학습하는 백엔드 개발자
post-custom-banner

0개의 댓글