프로그래밍/Algorithm

[프로그래머스] 야간 전술보행

일단개그하다 2022. 11. 13. 23:03

문제

https://school.programmers.co.kr/learn/courses/30/lessons/133501

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

접근 방법 및 풀이

화랑이가 1미터 움직일 때 마다 경계 근무를 서는 근무자의 근무 시간인지 확인하고 해당 근무자가 근무하는 영역에 화랑이가 포함 되는지 확인

 

중요한 점은 scope의 근무 영역이 오름차순 정렬이 되어 있지 않은 테스트 케이스가 있으므로 근무 영역을 확인 하는 경우에는 0번째 수와 1번째의 수 중에 작은 수와 큰 수를 비교 하여 근무 영역을 비교 해야 함

public class Q30_133501 {
    public int solution(int distance, int[][] scope, int[][] times) {
        int index = 1;
        int length = scope.length;
        while (index < distance) {
            for (int i = 0; i < length; i++) {
                int[] t = times[i];
                int[] s = scope[i];
                if (isWork(index, t) && isScope(index, s)) {
                    return index;
                }
            }
            index++;
        }

        return index;
    }

    public boolean isWork(int index, int[] time) {
        int totalTime = time[0] + time[1];
        index = index % totalTime;
        return index != 0 && index <= time[0];
    }

    public boolean isScope(int index, int[] scope) {
        int min = Math.min(scope[0], scope[1]);
        int max = Math.max(scope[0], scope[1]);
        return index >= min && index <= max;
    }
}