🔗 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/133501
✏️ 풀이
function solution(distance, scope, times) {
const guard = scope
.map((v, i) => ({ scope: v.sort((a, b) => a - b), time: times[i] }))
.sort((a, b) => a.scope[0] - b.scope[0]);
let i = guard[0].scope[0];
let j = 0;
while (i < distance) {
const [, end] = guard[j].scope;
const [work, rest] = guard[j].time;
if ((i - 1) % (work + rest) < work) {
break;
}
if (i === end && j < guard.length - 1) {
j++;
i = guard[j].scope[0];
} else {
i++;
}
}
return i;
}
먼저 scope를 가장 먼저 침입하게 될 구간 순서대로 오름차순으로 정렬한다. 이 때, scope 내의 구간 [a, b]에 대해서 반드시 a < b인 입력만 들어오지는 않으므로, 이 [a, b]또한 오름차순으로 정렬한다. 그리고 scope에 해당하는 time을 알기 위해서 scope와 time을 모두 갖는 객체로 변환하여 guard라는 배열을 새로 만들었다. 그리고 이 guard라는 배열을 scope의 각 구간이 시작되는 순서대로 오름차순 정렬하였다.
i는 현재 진입한 구간, j는 현재 감시 구간(scope)의 인덱스를 가리킨다.
만약 화랑이가 i 미터 지점에 진입했을 때 현재 감시 구간의 경비병이 근무중인지 여부는 (현재 경과된 시간 - 1)을 (근무 + 휴식)으로 나눈 나머지를 통해 그 나머지를 근무 시간과 비교하여 알 수 있다. 만약 나머지가 근무 시간보다 작다면 현재 근무중이므로 즉시 while문을 탈출한다. 그렇지 않다면 i를 증가시킨다. 이 때, 만약 현재 진입한 곳이 현재 감시 구간의 마지막 지점이라면 현재 감시 구간을 모두 무사히 통과한 것이므로 현재 감시 구간과 다음 감시 구간 사이를 일일이 확인하지 않고 바로 다음 감시 구간의 시작 지점으로 이동하도록 하였다.
'연습장 > 프로그래머스 문제풀이' 카테고리의 다른 글
[프로그래머스 Level 2] 연속 부분 수열 합의 개수 - JavaScript (0) | 2022.11.04 |
---|---|
[프로그래머스 Level 2] 롤케이크 자르기 - JavaScript (0) | 2022.10.31 |
[프로그래머스 Level 3] 최고의 집합 - JavaScript (0) | 2022.10.18 |
[프로그래머스 Level 3] 불량 사용자 - JavaScript (1) | 2022.09.23 |
[프로그래머스 Level 2] 후보키 - JavaScript (0) | 2022.09.22 |