Algorithm/HackerRank

[HackerRank] Time Conversion - Java

ikjo 2022. 1. 26. 19:12

문제 설명

 

 

Time Conversion | HackerRank

Convert time from an AM/PM format to a 24 hour format.

www.hackerrank.com

 

풀이 : Success

소스 코드

    public static String timeConversion(String s) {
        // Write your code here
        String noon = s.substring(s.length() -2);
        int hour = Integer.parseInt(s.substring(0, 2));
        String rest = s.substring(2, s.length() -2);

        StringBuilder sb = new StringBuilder();
        if (noon.equals("PM")) {
            if (hour < 12) {
                sb.append(hour + 12);
            }
            else {
                sb.append(hour);
            }
        }
        else {
            if (hour < 10) {
                sb.append(0);
                sb.append(hour);
            }
            else if (hour < 12) {
                sb.append(hour);
            }
            else {
                sb.append("00");
            }
        }
        sb.append(rest);

        return sb.toString();
    }

 

풀이 회고

문제에서는 12시간(AM, PM) 형식의 시간(문자열)이 주어지면 이를 24시간 형식의 시간(문자열)으로 변환 및 반환하는 것을 요구하고 있다. 우선 AM 및 PM 형식의 시간별로 24시간 형식의 시간을 나타내면 다음과 같다.

AM 24시간 형식 PM 24시간 형식
12:00:00AM 00:00:00 12:00:00PM 12:00:00
01:00:00AM 01:00:00 01:00:00PM 13:00:00
05:00:00AM 05:00:00 05:00:00PM 17:00:00
09:00:00AM 09:00:00 09:00:00PM 21:00:00
11:00:00AM 11:00:00 11:00:00PM 23:00:00

※ 참고로 12시간 AM PM 형식의 시간에서 0시란 존재하지 않으며 1시~12시만 존재한다.

 

문제 해결을 위해 문자열 메서드 substing을 이용하여 입력되는 문자열에서 AM/PM 부분과 시간 부분 그리고 나머지(분, 초) 부분을 별도로 추출하였다. 이후 PM일 경우와 AM일 경우를 각각 나누어 변환 작업을 시행했다. 우선 PM일 경우 1~11시에 해당하는 경우 12를 더해주어야 24시간 형식으로 알맞게 변형된다. 12시인 경우는 그대로 12시이므로 별다른 작업을 해주지 않았다. AM일 경우 12시에 해당하는 경우 시간 부분을 00시로 바꿔주어야 하고 나머지 시간대에서는 그 시간을 그대로 유지하면 된다. 하지만 1~9시간에 경우 처음 입력받을 때 비교 연산을 위해 정수(int)형으로 저장하여 앞에 0이 사라졌으므로 별도로 0을 추가시켜주도록 했다.

 

중간 중간 문자열 연산은 StringBuilder 객체를 사용하였고 PM AM별로 시간을 append 시킨 이후 최종적으로는 나머지(분, 초) 부분을 append 시켰다.

 

모범 소스 코드

    public static String timeConversion(String s) {
        // Write your code here
		DateFormat inFormat = new SimpleDateFormat( "hh:mm:ssaa");
		DateFormat outFormat = new SimpleDateFormat( "HH:mm:ss");

		Date date = null;
		try {
			date = inFormat.parse(s); 
		} catch (ParseException e ){
			e.printStackTrace();
		}
		if ( date != null ){
			String myDate = outFormat.format(date);
			System.out.println(myDate);
		}
    }

 

소스코드 분석

위 풀이는 HackerRank 인도 User SRIKANTH766님의 풀이로 가장 직관적이었던 소스코드였다. 위 풀이에서는 입력 문자열에 대한 SimpleDateFormat 객체출력 문자열에 대한 SimpleDateFormat 객체를 생성하여 문제를 해결하였다.

 

입력 문자열에 대한 SimpleDateFormat 객체를 생성 시 "hh:mm:ssaa"를 인자로 두고 있는데, hh는 12시간 형식의 시간(1~12), mm는 분(00~59), ss는 초(00~59), aa는 AM 또는 PM을 의미한다. 이 인자를 통해 12시간 형식의 시간 형태로 패턴화(parse, format 등 변환)할 수 있게 된다. 또한 출력 문자열에 대한 SimpleDateFormat 객체를 생성 시 "HH:mm:ss"를 인자로 두고있는데, HH는 24시간 형식의 시간(01~23)을 의미하며 mm과 ss는 앞서 설명한 것과 동일하다. 마찬가지로 이를 이용하면 24시간 형식의 시간 형태로 패턴화할 수 있다.

 

SimpleDateFormat을 이용하여 입력받은 문자열을 24시간 형식의 시간 형태의 문자열로 변환 해주기 위해서는 먼저 입력받은 문자열을 Data 인스턴스로 변환해주어야 한다. 이때 SimpleDateFormat 객체의 parse 메서드를 사용한다.(String → Date) parse는 SimpleDateFormat 클래스의 조상(추상) 클래스인 DateFormat에 정의된 것으로 다형성을 나타낸다.

 

최종적으로 parse를 통해 얻은 Date 인스턴스를 24시간 형식의 문자열로 변환하기 위해 SimpleDateFormat 객체의 format 메서드를 사용(Date → String)하면 원하는 값을 얻을 수 있다.

 

기존의 나의 풀이처럼 특정 사용자로부터 날짜 데이터를 문자열로 입력받을 때, 입력받은 문자열을 날짜로 인식 및 처리하여 원하는 날짜로 만들기 위해서는 substring을 통해 번거로운 작업을 했어야 했는데 이처럼 parse와 format을 이용하면 간단하게 원하는 데이터를 얻어낼 수 있다.

 

 

 

 

'Algorithm > HackerRank' 카테고리의 다른 글

[HackerRank] Save the Prisoner! - Java  (0) 2022.01.27
[HackerRank] Number Line Jumps - Java  (0) 2022.01.26
[HackerRank] Diagonal Difference - Java  (0) 2022.01.26