728x90
문제
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 보다 느리다.
'ALGORITHM > 프로그래머스 With JS' 카테고리의 다른 글
[프로그래머스] H-Index / Javascript (1) | 2021.05.03 |
---|---|
[프로그래머스] 가장 큰 수 / Javascript (0) | 2021.05.02 |
[프로그래머스] 기능개발 / Javascript (0) | 2021.04.30 |
[프로그래머스] 다리를 지나는 트럭 / Javascript (0) | 2021.04.29 |
[프로그래머스] 위장 / Javascript (0) | 2021.04.29 |
댓글