[JavaScript] 백준 1764번 듣보잡

지애·2024년 11월 8일
1

JavaScript

목록 보기
6/7

JS로 코테를 준비하기로 마음먹었지만... 그새 마음이 바뀌어 python으로 백준 문제를 풀고 있었다. 하지만 프론트엔드 개발자의 길로 들어서기로 마음 먹은 이상, 이제 정말 JS로 코테 준비를 할 시기가 찾아 온 것 같다. (이제는! 더 이상! 물러날 곳이 없! 다!)

그래서 지금부터라도 하루에 한 문제씩 JS로 백준 문제를 풀어보려 한다. 가장 일정이 빠른 코테에서 구름 IDE를 사용한다길래, JS 입출력 코드까지 연습하기 위해 프로그래머스 보다는 백준 문제 풀이를 택했다. python으로 solved.ac의 class 3 초반 정도까지 풀었는데 이어서 남은 문제를 JS로 풀이해보려 한다.

문제 풀이 아이디어

듣도 못한 사람들과 보도 못한 사람들을 각각 set으로 받아 둘의 교집합을 계산하면 되는 문제다.
아이디어는 금방 생각났지만...JS 문법과 자료형에 익숙하지 않아 서치를 해가면서 문제를 풀었다.

코드 조각

const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
});

백준은 입출력 스켈레톤 코드를 제공하고 있지 않기 때문에 직접 입출력 코드를 작성해야 한다. fs를 사용하는 방법이 더 빠르다고는 하지만, 구름과 같은 타 플랫폼에서는 적용하기 어려운 방법인 것 같아 readline 라이브러리를 사용했다.

// 입력을 받기 위한 array
const lines = [];

// rl.close() 가 호출되기 전까지 계속 입력을 받는다
rl.on('line', (line) => {

// 받은 입력은 공백으로 구분하여 한 줄 당 하나의 array로 저장하여 lines에 push 한다
    lines.push(line.split(' '))

// 입력 종료 조건 (조금 더 간단하게 입력을 받을 수 있을 것 같은데 아직 방법을 찾지 못했다) 
    if (lines.length > 0 && lines.length === Number(lines[0][0]) + Number(lines[0][1]) + 1){
        rl.close();
    }
}).on('close', () => {
    // solution 코드 작성 공간
    process.exit(); // 프로그램 종료
});

입력을 저장하기 위한 코드이다. 문제를 풀기 쉽도록 입력을 잘 저장해 놓는 것과 제때 입력을 중지하는 것이 관건인 것 같다. 당시에는 solution 코드를 close 함수 내에 작성했는데 아예 solution 함수로 밖으로 빼서 작성하는게 깔끔하고 보기 편할 것 같다.

// solution 코드
    const N = Number(lines[0][0]);
    const M = Number(lines[0][1]);
    const heared = [];
    const seen = new Set();

    for (let i = 0; i < N; i++){
        heared.push(lines[i + 1][0]);
    }

    for (let i = 0; i < M; i++){
        seen.add(lines[i + N + 1][0]);
    }

    const hearedAndSeen = heared.filter((e) => seen.has(e)).sort();
    console.log(hearedAndSeen.length);
    console.log(hearedAndSeen.join('\n'));

듣도 못한 사람을 array에 저장하고, 보도 못한 사람을 set에 저장했다. 그리고, 듣도 못한 사람 array를 순회하면서 보도 못한 사람 set에 해당 요소가 존재하는지 확인하고 존재하는 경우만 filtering 했다. console.log()는 시간이 오래 걸리기 때문에 모든 입력을 String에 모아두었다가 한 번에 출력하는게 좋다고 한다.

전체 코드

const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
});

const lines = [];

rl.on('line', (line) => {
    lines.push(line.split(' '))

    if (lines.length > 0 && lines.length === Number(lines[0][0]) + Number(lines[0][1]) + 1){
        rl.close();
    }
}).on('close', () => {
    const N = Number(lines[0][0]);
    const M = Number(lines[0][1]);
    const heared = [];
    const seen = new Set();

    for (let i = 0; i < N; i++){
        heared.push(lines[i + 1][0]);
    }

    for (let i = 0; i < M; i++){
        seen.add(lines[i + N + 1][0]);
    }

    const hearedAndSeen = heared.filter((e) => seen.has(e)).sort();
    console.log(hearedAndSeen.length);
    console.log(hearedAndSeen.join('\n'));
    process.exit();
});
profile
차근차근

0개의 댓글