본문 바로가기
알고리즘

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

by 상후 2022. 11. 14.
728x90
반응형

 

 

https://github.com/ROUTINE-STUDY/Algorithm

알고리즘 스터디를 진행하고 있습니다. 😊
초보들로 구성되어있으며, 열심히 풀어보고 풀이 방식을 공유하고 피드백을 해주는 스터디입니다.
참여 문의는 댓글 혹은 GitHub 주소를 참고해주세요.

문제 출처 :  https://school.programmers.co.kr/learn/courses/30/lessons/133501

 

프로그래머스

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

programmers.co.kr

내 코드(JAVA)

 

class Guards {
    static class Guard {
        private int[] scope;
        private int[] times;
        private Queue<String> workList = new ArrayDeque<>();
        private boolean isWatch;

        public Guard(int[] scope, int[] times) {
            this.scope = scope;
            this.times = times;

            for (int i = 0; i < times.length; i++) {
                String status = i == 0 ? "WORK" : "REST";
                for (int j = 0; j < times[i]; j++) {
                    workList.add(status);
                }
            }
        }

        public void writeWorkList() {
            for (int i = 0; i < times.length; i++) {
                String status = i == 0 ? "WORK" : "REST";
                for (int j = 0; j < times[i]; j++) {
                    workList.add(status);
                }
            }
        }
    }

    List<Guard> guardList = new ArrayList<>();

    /**
     * 경비병 추가
     */
    public void addGuard(int[][] scope, int[][] times) {
        for (int i = 0; i < scope.length; i++) {
            guardList.add(new Guard(scope[i], times[i]));
        }
    }

    /**
     * 경비병 상태 수정
     */
    public void moveGuard() {
        for (Guard guard : guardList) {
            if (guard.workList.isEmpty()) {
                guard.writeWorkList();
            }
            String status = guard.workList.poll();
            guard.isWatch = "WORK".equals(status);
        }
    }

    /**
     * 현재 거리에 경비병이 근무중인지 확인하는 메서드
     */
    public boolean checkGuard(int distinct) {
        for (Guard guard : guardList) {
            if (guard.isWatch) {
                int scopeStart = guard.scope[0];
                int scopeEnd = guard.scope[1];

                if ((scopeStart <= distinct && scopeEnd >= distinct) || (scopeEnd <= distinct && scopeStart >= distinct)) {
                    return true;
                }
            }
        }

        return false;
    }

}
public int solution(int distance, int[][] scope, int[][] times) {
        int answer = 0;

        Guards guards = new Guards();
        guards.addGuard(scope, times);

        while (answer < distance) {
            answer++;
            guards.moveGuard();

            if (guards.checkGuard(answer)) {
                break;
            }
        }

        System.out.println(answer);
        return answer;
    }

 

 

728x90
반응형

댓글