[알고리즘] 프로그래머스-스택/큐-프린터

BigChoi·2022년 3월 12일
0

알고리즘

목록 보기
3/4
post-thumbnail

문제설명

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다.

  1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
  2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.
  3. 그렇지 않으면 J를 인쇄합니다.

제한사항

  • 현재 대기목록에는 1개 이상 100개 이하의 문서가 있습니다.
  • 인쇄 작업의 중요도는 1~9로 표현하며 숫자가 클수록 중요하다는 뜻입니다.
  • location은 0 이상 (현재 대기목록에 있는 작업 수 - 1) 이하의 값을 가지며 대기목록의 가장 앞에 있으면 0, 두 번째에 있으면 1로 표현합니다.

입출력 예

prioritieslocationreturn
[2, 1, 3, 2]21
[1, 1, 9, 1, 1, 1]05

문제 풀이

문제를 읽어보면 원본 배열의 인덱스가 불변해야된다는 조건이 있다. 때문에 원본 배열의 인덱스가 변하지 않는 형태로 매개변수로 들어온 priorities 배열을 우리가 원하는 형태로 변형해주었다.

const newArr = priorities.map((value, index)=> [value, index])

이제 newArr는 [[value, index],[value, index], ...] 형태로 변환이 되었다.

const sortedArr = [];

이제 루프를 돌면서 로직을 구현해주기 위해 루프를 빠져나올 때 쓰일 isfind 라는 변수의 토큰을 만들어주고 루프를 돌렸다.
먼저 배열의 첫 번째 값을 뽑아낸다. shift() 메소드는 pop() 메소드와 반대로 배열의 가장 첫 값을 삭제해서 해당 값을 리턴해주는 메소드이다.

if문
shfit된 값을 some()메소드를 통해 shift가 된 이후 변형된 배열의 첫 번째 값과 비교해서 만약에 변형된 배열의 첫 번째 값이 더 큰 경우 다시 해당 배열에 push() 해준다.

else문
location으로 들어론 값과 shifted[1] 인덱스 값과 비교해서 같은 경우는 루프를 빠져나가고, 같지 않는 경우라면 answer ++ 해준다.

function solution(priorities, location) {    
    var answer = 0;
    const newArr = priorities.map((value, index)=> [value, index])
    const sortedArr = [];

    let isfind = false
    while(!isfind) {
        const shifted = newArr.shift();
        if (newArr.some((arr) => shifted[0] < arr[0])) {
            //shift한 값과 shift한 후 배열의 첫 번째 값과 비교 후, 배열의 첫 값이 더 큰 경우
            newArr.push(shifted)
        } else {
            if (shifted[1] === location) {
                isfind = true;
            } else {
                answer ++;
            }
        }
    }
    return answer + 1;
}

느낀점

테스트 케이스만 보고 풀었을 때는 가장 큰 수 순서대로 정렬를 하고, 매개변수로 들어온 location값을 루프를 돈 만큼 더해준 뒤에

배열길이 - (location + i + 1)을 해서 문제를 풀었다.
하지만 테스트 케이스는 정상적으로 통과했지만, 실제 채점과정에서 매우 잦은 오답률을 보였고, 해당 방식이 아닌 지금의 방식으로 문제를 풀게 되었다!

profile
천천히 한 걸음씩

0개의 댓글