My Boundary As Much As I Experienced

나는야 포켓몬 마스터 이다솜(백준 코딩테스트 1620번, 해시조회, NodeJS 풀이) 본문

Algorithm/Coding Test

나는야 포켓몬 마스터 이다솜(백준 코딩테스트 1620번, 해시조회, NodeJS 풀이)

Bumang 2023. 9. 2. 15:00

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

 

 

문제 수준:

실버4

 

문제 요약:

이다솜씨가 포켓몬 암기 시험 보는데 쉽게 풀기 위해

1. 번호가 나오면 해당 번호 포켓몬 이름 대기

2. 이름이 나오면 해당 이름 포켓몬 번호 대기

를 하는 프로그램을 만들어줘라.

(문제의 3분의2는 헛소리이고 결국 하라는건 이거였다ㅋㅋ..)

 

입출력 예 (입력 / 출력):

첫째줄엔 도감 등록 포켓몬 갯수 N와 시험 문제 갯수 M가 나오고

두번째 줄부터 N+1번째 줄까진 도감 등록 포켓몬 이름들이 나오고,

나머지 줄들은 문제가 나온다.

도감에 등록된 순서가 포켓몬의 번호이다.

 

문제 풀이 전략:

같은 날 푼 요세푸스 문제와 같은 레벨 문제가 맞나? 싶을 정도로 쉽게 풀었다.

1. 포켓몬 번호가 주어지면 배열의 인덱스에 접근해서 푼다.

2. 포켓몬 이름이 주어지면 객체의 대괄호 표기법으로 접근해서 문제를 푼다.

이 두 로직이면 된다.

 

배열은 입력값을 slicing해서 쉽게 얻을 수 있었고,

객체는 for문을 돌면서 'const arr['Pikachu'] = 25' 이런 식으로 딱 한 번만 저장했다. (O(n))

딱 한 번 객체로 저장하는 순회만 하면, 조회하는데엔 O(1)을 보장한다.

 

만약 초보자스럽게 이름과 indexOf의 조합으로 포켓몬의 번호를 알아내려 했다면,

조회할때마다 O(n)의 시간복잡도를 체험해야만 한다. (시간 초과 난다.)

 

 

내 풀이:

let fs = require("fs");
let input = fs.readFileSync("input.txt").toString().trim().split("\n");

let [totalNum, questNum] = input[0].split(" ").map(Number);
const dogamArr = input.slice(1, totalNum + 1); // 도감 배열 만들기
const dogamObj = {};

for (let i = 0; i < dogamArr.length; i++) {
  dogamObj[dogamArr[i]] = i + 1; //도감 객체 만들기
}

const questions = input.splice(totalNum + 1); // 문제 slicing

questions.forEach((el) => { // 문제 푸는 로직
  if (Number(el)) {
    console.log(dogamArr[+el - 1]);
  } else {
    console.log(dogamObj[el]);
  }
});