https://school.programmers.co.kr/learn/courses/30/lessons/42587
- 우선순위 높은순 실행 숫자가 큰 1-9
- 숫자가 클수록 우선순위가 높다
- location = index
- queue앞에서 빼고 뒤에 넣고 순회한다
- Math.max(...arr)
- shift remove
- some
첫번째 풀이(성공)
function solution(priorities, location) {
var answer = 0;
priorities = priorities.map((p, i) => ({priority: p, location: i}));
while(priorities.length) {
const curr = priorities.shift();
// 현재보다 큰 순위가 없을 때 삭제
if (!priorities.some(p => p.priority > curr.priority)) {
answer++;
if (curr.location === location) {
return answer;
}
} else {
// 현재보다 큰 순위가 있으면 뒤로 넣는다
priorities.push(curr);
}
}
return answer;
}
두번째 풀이(성공)
- queue배열에 각 priorities의 {순위, location} 를 담는다
- queue 앞에서부터 curr을 빼서 타겟을 찾을떄까지 순회한다
- curr의 현재순위가 최상순위이다
- curr을 queue에서 삭제한다
- answer++;
- curr의 location이 목표물이면 순회를 멈춘다
- 최상순위의 갯수를 변경한다.
- 최상순위가 1개면 hash에서 최상순위를 delete한다 (obj에서 key와 value삭제하기 delete hash[최상순위])
- 2개 이상이면 -= 1
- 최상순위가 아니면
- queue에서 맨 앞을 빼서 queue뒤로 넣어준다
- curr의 현재순위가 최상순위이다
function solution(priorities, location) {
var answer = 0;
const hash = {}; // {순위: 갯수} 순위비교
priorities.forEach(p => hash[p] = (hash[p] || 0) + 1);
const queue = priorities.map((p, i) => ({p, i})); // {p: 순위, i: location}
let foundTarget = false;
function getMaxPriority() {
return Math.max(...Object.keys(hash));
}
// location을 찾을때까지
while(queue.length && !foundTarget) {
const {p, i} = queue[0];
// 현재순위가 최상순위일때 삭제
if (p === getMaxPriority()) {
// 1개 일때
if (hash[p] === 1) {
delete hash[p];
} else {
hash[p] -= 1;
}
answer++;
queue.shift();
if (i === location) foundTarget = true;
} else {
queue.push(queue.shift());
}
}
return answer;
}
'알고리즘' 카테고리의 다른 글
[union find, dfs] 전력망을 둘로 나누기 (0) | 2023.10.13 |
---|---|
[해쉬, 이진탐색, 문자열, regex, 정렬] 순위 검색 (카카오블라인드 2021) (0) | 2023.10.13 |
[프로그래머스] 다리를 지나는 트럭 JS (큐) (0) | 2023.10.12 |
[스택] 기능개발 (0) | 2023.10.11 |
[순서 확인 shift] 스킬트리 (0) | 2023.10.11 |