본문 바로가기
ALGORITHM/프로그래머스 With JS

[프로그래머스] 프린터 / Javascript

by LAY CODER 2021. 5. 1.

문제

 

코딩테스트 연습 - 프린터

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

programmers.co.kr


 

TRY

function solution(priorities, location) {

    // 순위 초기화
    let ranking = 0;

    // 대기목록이 다 비워질 때 까지
    while (priorities.length) {
        // 대기목록 첫번째 요소 배열 최대값보다 작은 경우
        if (priorities[0] < Math.max(...priorities)) {
            // 첫번째 요소가 자신일 경우 location을 배열 마지막으로 옮김
            if (--location < 0) location = priorities.length - 1;
            // 제일 앞 요소를 뺴서 제일 뒤에 넣는다
            priorities.push(priorities.shift());
        } else {
            // 순위를 업데이트 해줌
            ranking++;
            // 배열을 빠져나가는 게 자신일 경우 멈추고 순위를 return
            if (--location < 0) return ranking;
            // 자신이 아니면 제일 앞의 요소 빼낸다.
            priorities.shift();
        }
    }
}

console.log(solution([2, 1, 3, 2], 2));
console.log(solution([1, 1, 9, 1, 1, 1], 0));

 

대기목록이 다 비워질 때 까지 무한루프를 돌리면서 첫번째 요소가 최대값보다 작은지 확인한다.

 

최대값보다 작을 때 첫 번째 요소가 자신일 경우 위치를 대기목록 제일 뒤로 옮겨준다.

 

그리고 제일 앞 요소를 대기목록 제일 뒤로 넣어준다. 

 

첫 번째 요소가 최대값일 때는 순위를 업데이트 해주고 그 요소가 자신의 문서일 경우

 

순위를 반환하고 아니면 location을 앞으로 옮겨주고 배열의 제일 첫 요소를 빼준다.

 


 

Refactoring

function solution(priorities, location) {
    // 대기열 문서를 내 문서인지 확인하는 boolean isMe와 value를 가진 객체로 변환
    // map,some 때문에 속도가 느려지기 때문에 풀이 1이 더 나은거 같음.
    let list = priorities.map((element, index) => ({
        isMe: index === location,
        val: element,
    }));

    let ranking = 0;

    while (true) {
        // 첫 문서를 빼서 자신보다 중요도가 높은 문서가 하나라도 있으면
        // 대기열 제일 뒤로 보낸다
        let firstPage = list.shift();
        if (list.some((element) => element.val > firstPage.val)) {
            list.push(firstPage);
        } else {
            // 없으면 순위를 갱신하고 그 문서가 자신인지 확인한다.
            // 자신이 맞으면 순위를 return
            ranking++;
            if (firstPage.isMe) return ranking;
        }
    }
}

console.log(solution([2, 1, 3, 2], 2));
console.log(solution([1, 1, 9, 1, 1, 1], 0));

 

Array.map()을 이용하여 자신의 문서인지 확인하는 boolean isMe와 그 값을 나타내는 val로 이루어진 객체 배열로 변환한다.

 

첫 문서를 꺼내서 Array.some()을 이용하여 자신의 값보다 높은 값이 있으면 최대값이 아니므로 배열 제일 뒤로 push하고

 

없으면 순위를 갱신하고 그 문서가 자신인지 확인한다.

 

그 문서가 자신의 문서가 맞으면 ranking을 리턴한다.

 

map,some 등 function 이용이 많아서 인지 속도면에서는 풀이 1 보다 느리다.

댓글