본문 바로가기

Programmers

[프로그래머스][JAVA]Lv. 2 - 야간 전술보행 문제

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

 

프로그래머스

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

programmers.co.kr

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 문으로 해결할 수 있을지도