프로그래머스
모든 테스트케이스가 5~8ms 정도 걸렸다. 배열을 복사해서 내림차순 정렬시켜 0번째 값과 비교하려고 하였는데, 그 과정에서 copied, value 등 여러 변수를 사용하고, 원본배열 요소의 데이터타입을 문자열로 변경시켰다. 그래서, 가독성과 기능이 아쉽다.
cnt
는 인쇄 횟수를 카운트한다.
copied
는 인자로 받은 priorities를 복사해 오름차순 정렬한다.
기존 priorities 배열의 location번째 값을 문자열로 변환시켜 같은 중요도를 갖더라도, 내가 인쇄하려는 요청임을 표시한다.
priorities가 빈배열이 아닐때까지 반복한다
==
)copied
shift===
)반복문 끝내기cnt 리턴하기
function solution(priorities, location) {
let cnt = 0;
const copied = priorities.slice();
copied.sort((a,b) => b-a);
priorities[location] += "";
const value = priorities[location];
while(priorities.length) {
const list = priorities.shift();
if(list == copied[0]) {
cnt++;
copied.shift();
if(list === value) break;
} else{
priorities.push(list);
}
}
return cnt;
}
다양한 map, some, findIndex 메소드를 사용해서 코드를 이해하기 쉬웠다. 그런데, 사용한 모든 메소드들이 반복문을 사용해서 콜백함수를 실행시키기 때문에 시간이 더 오래걸린다. 8번 테스트케이스의 경우, 이 풀이로는 10ms 이상 소요되었지만, 위의 풀이로는 5ms 정도 소요되었다. priorities의 배열의 크기가 커질수록 다른 풀이에 비해 소요되는 시간이 더 오래걸리는 것 같다.
map
을 사용해서 priorities
배열을 통해 알 수 있는 정보를 객체로 저장하고, 새로운 배열 arr
에 맵핑한다.
ex.
[{ index: 0, priority: 2 }, { index: 1, priority: 1 }, { index: 2, priority: 3 }, { index: 3, priority: 2 }]
반복문으로 arr
의 첫번째 요소를 꺼낸다.
some
을 사용해서 arr
의 요소의 중요도를 비교해 hasHighPriority
에 true, false를 저장한다. arr
에 푸시queue
에 푸시프린트된 요소가 queue
에 순서대로 저장되므로 findIndex
메소드를 사용해서 프린트된 요소.index와 location이 같은 요소의 인덱스를 구한다. 구한 인덱스에 1을 더해 리턴한다. (순서대로 저장되었으므로 인덱스+1을 하면 몇번째로 프린트되었는지 알 수 있다.)
function solution(priorities, location) {
var arr = priorities.map((priority, index) => {
return {
index: index,
priority: priority
};
});
var queue = [];
while(arr.length) {
var firstEl = arr.shift();
var hasHighPriority = arr.some(el => el.priority > firstEl.priority);
if(hasHighPriority) {
arr.push(firstEl);
} else {
queue.push(firstEl);
}
}
return queue.findIndex(queueEl => queueEl.index === location) + 1;
모든 테스트케이스가 1ms 미만으로 걸렸다. 이 풀이는 priorities 배열이 바뀌는 것에 맞춰서 location의 값을 변경해주었다. 이해하기 쉬우면서도 가장 빠른 풀이인 것 같다.
function solution(priorities, location) {
var answer = 0;
while(priorities.length>0) {
const job = priorities.shift();
if(priorities.some(i => i>job)){
priorities.push(job);
location = location==0 ? priorities.length-1 : location-1;
} else{
answer++;
if(location == 0) return answer;
else location--;
}
}
return answer;
}