https://school.programmers.co.kr/learn/courses/30/lessons/133501
1 ~ distance를 가는 동안 경비병이 감시하는 scope에 도달하였을 때, 경비병의 근무 상태를 확인.
근무 상태였을 경우 여태까지 왔던 거리를 정답으로 return 하는 문제였다.
class Solution {
public int solution(int distance, int[][] scope, int[][] times) {
int answer = 0;
int[] totalScopeRange = new int[distance];
for (int i = 0; i < scope.length; i++) {
if (scope[i][0] > scope[i][1]) {
int tmp = scope[i][1];
scope[i][1] = scope[i][0];
scope[i][0] = tmp;
}
for (int j = scope[i][0]-1; j <= scope[i][1]-1; j++) {
totalScopeRange[j] = scope[i][0];
}
}
for (int i = 0; i < distance; i++) {
answer++;
if (totalScopeRange[i] != 0) {
for (int j = 0; j < scope.length; j++) {
if (scope[j][0] == totalScopeRange[i]) {
if (i % (times[j][0] + times[j][1]) < times[j][0]) {
return answer;
}
}
}
}
}
return answer;
}
}
먼저 totalScopeRange 에 scope의 범위 중 작은 수를 scope [i][0]가 되도록 만들었다.
(두 번째 예시인 [[7,8], [4,6], [11,10]] 과 같이 큰 수가 먼저 나올 수 있기 때문에)
그 후, distance 를 증가시키면서 totalScopeRange 가 0 이 아니면
scope 배열에서 해당 값을 가지고 있는 배열을 찾고, 그 인덱스 값으로 근무 상태인지를 확인하였다.
경비병은 times[j][0] 만큼 일하고 times [j][1] 만큼 쉬기에
현재 위치 i 를 두 값의 합으로 나눈 나머지 값이 근무하는 시간인 time [j][0] 보다 작은 지를 확인하고
작다면 return 을 하도록 만들었다.
두 번째 예시처럼 if 문을 피해 간다면 distance 만큼의 값이 return 될 것이다.
사실... totalScopeRange 같이 안 만들어도 아래쪽 for 문으로 해결할 수 있을지도
'Programmers' 카테고리의 다른 글
[프로그래머스][JAVA]Lv. 2 - 영어 끝말잇기 (0) | 2023.03.06 |
---|---|
[프로그래머스][JAVA]Lv. 2 - 점프와 순간 이동 (0) | 2023.02.26 |
[프로그래머스][JAVA]Lv. 2 - 배달 (0) | 2023.02.19 |
[프로그래머스][JAVA]Lv. 2 - 택배상자 문제 (0) | 2022.11.02 |
[프로그래머스][JAVA]Lv. 2 - 롤케이크 자르기 문제 (0) | 2022.11.01 |