[백준-node.js-1620] 나는야 포켓몬 마스터 이다솜

이태헌·2023년 6월 9일
0
post-thumbnail

문제

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

풀이

let input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n') 
let [N,M] = [input[0].split(' ')[0],input[0].split(' ')[1]]
input.shift();
let sliceInput = input.slice(0,Number(N)) //처음부터 N개까지 배열에 입력
let arr1 = new Map(sliceInput.map((el,index)=>[el,index])) // Map에다가 하나씩 넣기
let arr2 = input.slice(Number(N)) // 검사해야하는 배열

let answer = [];

for(let x of arr2){
  if(!isNaN(x)) answer.push(sliceInput[x-1]) //x가 숫자이면 Map배열에서 인덱스 값 찾고
  else answer.push(arr1.get(x)+1) // 아니면 원래의 배열에서 해당하는 값 찾기
}

console.log(answer.join('\n')) // 정답 출력

처음에 시간복잡도를 계산하지않고 for문 안에서 indexOf를 사용하니 시간초과가 나왔다.
그래서 Map에 넣어서 Index값만 찾는 형식으로 변경

다른 풀이

var s = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
var k = s.shift().split(' ').map(function(e) { return parseInt(e); });
var x = {};
s.splice(0, k[0]).forEach(function(e, i) {
  x[e] = (i + 1);
  x[i + 1] = e;
});
console.log(s.map(function(e) { return x[e]; }).join('\n'));

k에 받아온 배열의 첫번쨰 숫자([26 , 5])를 넣고 x라는 object에 받아온 s0부터k[0]까지 즉 26까지 splice하고 그 배열을 forEach문을 돌려서 포켓몬의 이름과 인덱스 번호를 모두 저장한다.
ex) 1:"Bulbasaur", Bulbasaur : 1 이런식으로 모두 저장하면 한번만 돌면 모든 경우의 수를 다 체크 할 수 있다. 이후에 남은 s는 검사하는 배열(26~31번째 인덱스)과 같아지고 x[e]로 값 찾아서 출력 👍🏻

0개의 댓글