프로그래머스
모든 테스트케이스가 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;
}