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