[프로그래머스] 알고리즘 Kit - 프로세스

ss_kim·2024년 11월 12일

<코드>

function solution(priorities, location) {
    var answer = 0;
    
    let a = []
    let arr = priorities.map((item, i) => [i, item])

    for(let i = 0; i < priorities.length; i++) {
        const sliced = arr.slice(i)
        const max = Math.max(...sliced.map((item) => item[1]))
        const index = sliced.findIndex((item) => item[1] === max)
        
        arr = [...a, ...sliced.slice(index), ...sliced.slice(0, index)]
        a.push([sliced[index][0], max])
        
    }
    
    return answer = arr.findIndex((item) => item[0] === location && item[1] === priorities[location]) + 1
}



<풀이>

priorities를 각 요소와 인덱스로 구성된 새로운 배열로 바꾼 후, 순회하면서 가장 큰 값을 찾아 정렬해나감

반복문 안에 메서드가 사용되어 O(n^2)의 시간 복잡도를 가짐
효율성이 좋지는 않지만 priorities의 길이의 제한 사항이 100이라 통과는 됨




다른 사람 풀이

function improvedSolution(priorities, location) {
    let queue = priorities.map((priority, index) => ({ index, priority }));
    let answer = 0;

    while (queue.length > 0) {
        let current = queue.shift();
        if (queue.some(item => item.priority > current.priority)) {
            queue.push(current);
        } else {
            answer++;
            if (current.index === location) {
                return answer;
            }
        }
    }
}

some메서드를 사용해 queue의 우선 순위 중 맨 앞 요소보다 하나라도 큰 요소가 있다면 queue의 맨 뒤로 보내버림

맨 앞 요소의 우선 순위가 제일 높다면 queue에서 제거하고 카운트

profile
프론트엔드 개발자

0개의 댓글