[#2884][Java] 백준알고리즘 알람시계

김승원·2022년 5월 30일
0

알고리즘

목록 보기
1/2

📝문제

상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다.
이런 상근이를 불쌍하게 보던, 창영이는 자신이 사용하는 방법을 추천해 주었다.
바로 "45분 일찍 알람 설정하기"이다.
현재 상근이가 설정한 알람 시각이 주어졌을 때, 창영이의 방법을 사용한다면, 이를 언제로 고쳐야 하는지 구하는 프로그램을 작성하시오.

⌨️풀이

입력값을 받아 입력값을 유효성 검사를 통해 알맞은 데이터를 분별해 알맞게 값을 호출

  • 예제 입력1 10:10 => 예제 출력1 9:25
  • 예제 입력2 0:30 => 예제 출력2 23:45
  • 예제 입력3 23:40 => 예제 입력3 22:55

💻전체 코드

public class AlarmClock_2884 {
    static String guide = "입력 시간은 24시간 표현을 사용한다. 24시간 표현에서 하루의 시작은 \n" +
            "0:0(자정)이고, 끝은 23:59(다음날 자정 1분 전)이다. 시간을 나타낼 때, 불필요한 0은 사용하지 않는다.\n" +
            "ex) 10:10";
    static String fail = "fail";
    static String success = "success";
    static String inputData;
    static Scanner scan = new Scanner(System.in);
    //요구사항에 부합한 시간대 => 45분 일찍 일어나야 하는 요구사항에 45로 기입, 요구하는 시간은 항상 바뀔 수 있으니 변수로 따로 지정,
    static Integer requestedTime = 45;
    public static void main(String[] args) {
        //실행 함수 호출
        excute();
    }
    public static void excute() {
        //입력 가이드 제시
        System.out.println(guide);
        //알람시간을 입력 함수 호출
        input();
        //입력한 시간 유효성검사 실행
        Map<String, String> result = validate();
        //Map 형태의 데이터를 이용하여 failData 추출
        String failData = result.get(fail);
        //failData가 존재하면 Error 반환, 존재하지 않으면 계산 함수 실행
        if (failData != null)
            System.out.println("ERROR : "+failData);
        else
            calculate();
    }
    public static void input() {
        System.out.print("알람을 설정해주세요. >> ");
        inputData = scan.nextLine();
    }
    private static Map<String, String> validate() {
        Map<String, String> result = new HashMap<>();
        String regex = "^[0-9]*$";
        String split[] = inputData.split(":");
        if (!inputData.contains(":"))
            result.put(fail, "입력하신 문자열에 ':' 존재하지 않습니다.");
         else if (inputData.length() > 5)
            result.put(fail, "입력하신 문자열의 길이가 맞지 않습니다.");
         else if (!inputData.replace(":","").matches(regex))
            result.put(fail, "숫자만 입력 가능합니다.");
         else if (Integer.parseInt(split[0]) < 0 ||
                Integer.parseInt(split[0]) > 24)
            result.put(fail, "입력하신 시간 형식이 맞지않습니다.(0~24까지 입력 가능)");
         else if (Integer.parseInt(split[1]) < 0 ||
                Integer.parseInt(split[1]) > 60)
            result.put(fail, "입력하신 시간 형식이 맞지않습니다.(0~24까지 입력 가능)");
         else
            result.put(success, "알람이 성공적으로 설정되었습니다.");
         return result;
    }
    private static void calculate() {
        //':' 문자 기준으로 문자를 자름 :
        // ':' 기준 좌측은 시, 우측은 분
        String splitedTime[] = inputData.split(":");
        Integer hour = Integer.parseInt(splitedTime[0]);
        Integer min = Integer.parseInt(splitedTime[1]);
        // 요구하는 시간대는 항상 바뀔 수 있으니 변수로 선언해서 관리
        if (min - requestedTime < 0) {
            hour -= 1;
            hour = hour < 0 ? 23 : hour;
            min = 60 - (requestedTime - min);
        } else {
            min -= requestedTime;
        }
        System.out.println("입력하신 알람의 '"+requestedTime+"'분 전으로 맞춰졌습니다. " + hour + "시" + min+"분");
    }
}

✏️ 내가 제출한 코드에 대한 설명

  • excute() => 코어 로직 수행 함수
  • input() => 알람시간을 입력받는 함수
  • validate() => 입력받은 데이터의 유효성 검사
  • calculate() => 유효성 검사가 끝낸 데이터에 대한 계산 로직 함수
profile
Over shoes, over boots

0개의 댓글