코딩테스트 연습 - 프린터

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린

programmers.co.kr

내가 직접 푼 답

function solution(priorities, location) {
let count = 1;
let maxValue = Math.max.apply(null, priorities); // 배열의 최대값
const newArr = Array.from({ length: priorities.length }, () => 0); // 배열 갯수만큼 0으로 채워진 배열생성
while (!(newArr.indexOf(0) === -1)) { // newArr에 0이라는 값이 없을때까지 반복
for (let i = 0; priorities.length > i; i++) { // 기본 배열 갯수만큼 반복
if (priorities[i] === maxValue && maxValue !== 0) { // 현재 값이 최대값일경우 & (최대값이 0이 아닐경우)
newArr[i] = count; // newarr의 현재값 index의 값을 count값으로 변경한다.
count++; // count를 1 올린다.
priorities[i] = 0; // 현재 값을 0으로 바꾼다. (최대값 계산에서 제외하기 위해)
maxValue = Math.max.apply(null, priorities); // 최대값 계산을 다시한다.
}
}
}
return newArr[location]; // 새로운 배열의 location 인덱스의 값을 반환한다.
}

이번 문제는 로직을 이해하는데 많은 시간이 소요된거같다.
머릿속에서 로직이 짜여지지 않는데 코드로 나타낼수 있을리가..

이리저리 고민해보다가 우연히 기본 배열의 갯수만큼 0으로 채운 새로운 배열을 만들라는 힌트를 얻었다.
와.. 갑자기 어떻게 풀어내야할지 머릿속에 쫙쫙 그려진다.
배열의 가장 큰 수의 index 위치를 가장 작은 숫자(0)으로 바꾸고, 새로운 배열의 좀 전 index위치에 count 값을 집어넣는다.
count를 1씩 올려주는건 기본, 이후 배열의 가장 큰 수를 다시 구하는식으로 반복문을 돌렸다.

이제 반복문을 모두 돈 후엔 새로운 배열이 [4,5,1,2,3,6] 이런식으로 모두 채워지는데, 기존에 주어진 location을 index로 넣어 return하면 완성이다.

코드실행을 눌렀더니 통과가 쭈르르륵 나온다.