-
문제
programmers.co.kr/learn/courses/30/lessons/42587
접근법
본 문제는 우선순위에 따라서 프린트를 할 수 있게 해주는 프린터를 만드는 것이 목적이다.
1) 우선순위가 높은 출력물을 우선적으로 뽑는다.
1번은 2번을 진행하면 자동으로 해결이 된다.
2) 가장 앞에 있는 출력물보다 높은 우선순위를 가진 출력물이 존재하면, 출력물을 맨 뒤로 보낸다.
자신보다 뒤에 있는 모든 값을 비교하기 위해서 Loop 를 사용 하게 된다면, 시간 복잡도가 올라가서 자바스크립트 내에서 이를 해결 할 수 있는 방법을 찾던 도중 Array.some() 이라는 함수를 찾게 되었다.
Some을 이용하면, 자신의 값보다 큰 경우 탐색이 종료되어 더욱 간편하게 "큰 값이 있는지의 여부"를 확인 할 수 있다.
3) 큰 값이 있다면 맨 뒤로 보내고, 없다면 배열에서 뺀다.
2번을 통해 자신보다 뒤에 있는 값이 크다는 사실을 알게 되면
맨 앞의 값을 맨 뒤로 보내기 위해서, push를 사용하고 맨 앞에 있는 값은 shift()를 통해 제거한다.
4) 원하는 값이 몇 번째로 출력 되는지 알려준다.
매개변수(parameter) 로 주어진 location은 원하는 값의 위치가 저장된 변수이다.
이를 통해,자신의 순서가 오기 전의 값들인 경우 "-1" 을 해주면서 진행을 시키고, 만약 자신의 차례(index) 가 되었을 때 자신보다 큰 값이 없다면 바로 출력 해주면 된다.
하지만, 자신보다 큰 값이 뒤에 있다면 배열의 길이만큼을 자신에게 더하고(배열의 맨뒤로 보내지기 때문) 위의 작업을 반복한다.
코드
* 리팩토링 이전
function solution(priorities, location) { var answer = 0; var target_index = location; while ( priorities.length > 0 ) { // 중요도 높은 게 뒤에 있음 if ( priorities.some ( num => num > priorities[0]) ){ priorities.push(priorities[0]); priorities.shift(priorities[0]); if ( target_index === 0 ) { target_index = priorities.length-1; } else { target_index -= 1; } } else { priorities.shift(priorities[0]); answer = answer + 1; if ( target_index === 0 ) { break; } else { target_index -= 1; } } } return answer; }
* 리팩토링 이후
function solution(priorities, location) { let answer = 0; let target_index = location; while( priorities.length ) { if ( priorities.some ( num => num > priorities[0]) ){ priorities.push(priorities[0]); priorities.shift(priorities[0]); } else { priorities.shift(priorities[0]); answer += 1; if ( target_index === 0 ) { break; } } target_index -= 1; if ( target_index === -1) { target_index = priorities.length-1; } } return answer; }
'PS > 프로그래머스' 카테고리의 다른 글
[프로그래머스_스택] 다리를 지나는 트럭 ( by using JavaScript) (0) 2021.04.18 [프로그래머스_완전탐색] 소수찾기 ( by using JavaScript ) (0) 2021.04.15 [프로그래머스_구현] 모의고사 (0) 2021.04.15 [프로그래머스] 기능개발( 스택큐, by using javscript) (0) 2021.04.06 [프로그래머스_해시] 위장 ( by using javascript) (0) 2021.04.06 댓글