BOJ 1620 with js _ 나는야 포켓몬 마스터 이다솜

2 minute read

1620 with Node.js _ 나는야 포켓몬 마스터 이다솜

입력

첫째 줄에는 도감에 수록되어 있는 포켓몬의 개수 N이랑 내가 맞춰야 하는 문제의 개수 M이 주어져. N과 M은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수인데, 자연수가 뭔지는 알지? 모르면 물어봐도 괜찮아. 나는 언제든지 질문에 답해줄 준비가 되어있어.

둘째 줄부터 N개의 줄에 포켓몬의 번호가 1번인 포켓몬부터 N번에 해당하는 포켓몬까지 한 줄에 하나씩 입력으로 들어와. 포켓몬의 이름은 모두 영어로만 이루어져있고, 또, 음… 첫 글자만 대문자이고, 나머지 문자는 소문자로만 이루어져 있어. 아참! 일부 포켓몬은 마지막 문자만 대문자일 수도 있어. 포켓몬 이름의 최대 길이는 20, 최소 길이는 2야. 그 다음 줄부터 총 M개의 줄에 내가 맞춰야하는 문제가 입력으로 들어와. 문제가 알파벳으로만 들어오면 포켓몬 번호를 말해야 하고, 숫자로만 들어오면, 포켓몬 번호에 해당하는 문자를 출력해야해. 입력으로 들어오는 숫자는 반드시 1보다 크거나 같고, N보다 작거나 같고, 입력으로 들어오는 문자는 반드시 도감에 있는 포켓몬의 이름만 주어져. 그럼 화이팅!!!

출력

첫째 줄부터 차례대로 M개의 줄에 각각의 문제에 대한 답을 말해줬으면 좋겠어!!!. 입력으로 숫자가 들어왔다면 그 숫자에 해당하는 포켓몬의 이름을, 문자가 들어왔으면 그 포켓몬의 이름에 해당하는 번호를 출력하면 돼. 그럼 땡큐~

정답 코드

const fs = require("fs");
const stdin = (
  process.platform === "linux"
    ? fs.readFileSync("/dev/stdin").toString()
    : `` // 기본 입력값 설정 (백준 코딩테스트에서 비워놔도 무방하다.)
).split("\n");

const input = (() => {  //input()을 호출할 때마다 한줄씩 읽어온다.
  let line = 0;
  return () => stdin[line++];
})();

const [pocketmonCount, problemCount] = input().split(' ').map(v => Number(v));
let pocketmons = [];
let result = [];
for(let i = 0; i < pocketmonCount; i++ ){
  pocketmons.push(input());
}
const pocketmonMap = new Map(pocketmons.map((v,i) => [v, i+1])) // Map을 사용하지 않고 indexOf로 찾으면 시간 초과가 발생합니다.

for(let i =0; i<problemCount; i++){
  const value = input();
  if(Number.isNaN(parseInt(value))){
    result.push(pocketmonMap.get(value));
  }else{
    result.push(pocketmons[Number(value) -1]);
  }
}

console.log(result.join('\n')); // 결과 값 출력

살펴보아야 할 점

Array 외에 JS에서 쓰이는 함수

Map

  1. Object는 키로 문자열만 사용할 수 있지만 Map은 키 타입에 제한이 없습니다.
  2. Map은 내부적으로 해시테이블을 이용해 검색하기 때문에 검색속도가 빠릅니다.
  3. Map은 데이터를 다루기 위한 각종 메서드를 지원합니다.
    • clear() : 모든 데이터를 삭제
    • delete(key) : 해당 key값에 대한 데이터를 삭제
    • entries() : 맵이 가진 데이터를 삽입한 순서대로 리턴
    • forEach(callback) : 맵의 모든 데이터를 대상으로 callback 함수를 실행하며 순서는 삽입된 순서
    • get(key) : 해당 key에 대응된 value 값을 리턴
    • has(key) : 해당 key에 대한 데이터[가 있는지 판단(boolean)
    • keys() : 맵에 키값으로 이루어진 이터레이터를 리턴
    • set(key, value) : 맵에 해당 key, value 값을 추가
    • values() : 맵에 value값으로 이루어진 이터레이터를 리턴

Set

  • set은 중복되지 않은 데이터를 모은 객체입니다.
    • add(value) : set에 value를 추가합니다.
    • clear() : set의 모든 데이터를 삭제 합니다.
    • delete(value) : set에 value를 값을 가지는 데이터를 삭제 합니다.
    • values() : set의 데이터를 값으로 갖는 이터레이터를 리턴합니다.
    • forEach(callback) : set의 모든 데이터를 대상으로 callback 함수를 실행합니다.
    • has(value) : set에서 value를 값으로 갖는 데이터가 있는지 판별합니다.(boolean)

문제 링크

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

Leave a comment