집합과 맵


10815번 (숫자 카드)

const fs = require('fs');
const input = fs.readFileSync('./dev/stdin').toString().trim().split('\n');
const mySet = new Set(input[1].split(' ').map(Number));
const arr = input[3].split(' ').map(Number);
const answerArr = [];
let bool = true;
for (let i = 0; i < arr.length; i++) {
bool = mySet.has(arr[i]);
answerArr.push(bool ? 1 : 0);
}
console.log(answerArr.join(' '));
  • 처음에는 배열로 처리해서 indexOf 메소드를 이용해 해결하려 했는데 시간초과가 됐다.
  • 이후 문제의 의도에 따라 set객체를 이용해 해결했다.
  • 삼항연산자를 위와 같이 활용하니까 코드가 깔끔해서 보기 좋았다.
  • 14425번 (문자열 집합)

    const fs = require('fs');
    const input = fs.readFileSync('./dev/stdin').toString().trim().split('\n');
    const [N, M] = input.shift().split(' ').map(Number);
    const S = new Set();
    let answer = 0;
    for (let i = 0; i < N; i++) {
    S.add(input[i]);
    }
    for (let i = 0; i < M; i++) {
    if (S.has(input[N + i])) {
    answer++;
    }
    }
    console.log(answer);
  • input의 0~N 인덱스에 해당하는 문자열을 집합 S에 입력해준다.
  • N ~ M 까지의 인덱스에 해당하는 문자열이 집합 S에 포함되는지 확인한다.
  • 포함되면 answer를 +1 해준다.
  • 1620번 (나는야 포켓몬 마스터 이다솜)

    const fs = require('fs');
    const input = fs.readFileSync('./dev/stdin').toString().trim().split('\n');
    const [N, M] = input.shift().split(' ').map(Number);
    const dictArr = input.slice(0, N);
    const questArr = input.slice(N, N + M);
    const answerArr = new Array(M);
    const dictMap = new Map();
    for (let i = 0; i < N; i++) {
    dictMap.set(dictArr[i], i + 1);
    }
    for (let i = 0; i < M; i++) {
    if (isNaN(questArr[i])) {
    answerArr[i] = dictMap.get(questArr[i]);
    } else {
    answerArr[i] = dictArr[+questArr[i] - 1];
    }
    }
    console.log(answerArr.join('\n'));
  • Map을 이용해 도감의 포켓몬의 이름을 key로, 포켓몬의 번호를 value로 넣어주었다.
  • 문제에 isNaN을 씌워서 숫자이면 배열에 인덱스를 이용하여 접근하고,
  • 문자열이면 get을 이용하여 value에 있는 포켓몬 번호를 받아왔다.
  • 10816번 (숫자 카드 2)

    const fs = require('fs');
    const input = fs.readFileSync('./dev/stdin').toString().trim().split('\n');
    const N = +input[0];
    const M = +input[2];
    const numArr = input[1].split(' ').map(Number);
    const questArr = input[3].split(' ').map(Number);
    const numMap = new Map();
    const answerArr = [];
    for (let i = 0; i < N; i++) {
    numMap.set(numArr[i], 0);
    }
    for (let i = 0; i < N; i++) {
    numMap.set(numArr[i], numMap.get(numArr[i]) + 1);
    }
    for (let i = 0; i < M; i++) {
    if (numMap.has(questArr[i])) {
    answerArr.push(numMap.get(questArr[i]));
    } else {
    answerArr.push(0);
    }
    }
    console.log(answerArr.join(' '));
  • 상근이가 가지고 있는 카드들을 맵 객체에 담았다. 처음에는 value를 0으로 하여 담았다.
  • 이후 가지고 있는 카드들에 for문을 돌려서 해당 카드의 value를 +1 해주었다.
  • 만약 상근이가 해당 카드를 가지고 있다면 정답배열에 해당 value를 push하고 가지고 있지 않다면 0을 push했다.
  • 11478번 (서로 다른 부분 문자열의 개수)

    const fs = require('fs');
    const input = fs.readFileSync('./dev/stdin').toString().trim();
    const set = new Set();
    for (let i = 1; i <= input.length; i++) {
    for (let j = 0; j < input.length; j++) {
    set.add(input.slice(j, j + i));
    }
    }
    console.log(set.size);
  • Set 객체를 하나 생성해주고, slice와 이중 for문을 이용하여 set에 각 부분 문자열을 add 해주었다.
  • set의 size를 출력하였다.