문제 설명
주어진 12 시간 (AM / PM) 시스템을 24 시간 시스템으로 변환하시오.
참고: 자정은 12 시간제에서 12:00:00AM 로, 24 시간제에서 00:00:00 로 표기하고 정오는 12 시간제에서 12:00:00PM, 24 시간제에서 12:00:00 로 표기한다.
함수 설명
아래의 timeConversion
함수를 완성하시오. 반환 값은 입력 값을 24 시간제로 표현할 수 있는 새로운 문자열이어야 한다.
timeConversion
함수는 다음과 같은 매개변수를 가진다.
s : 12 시간제 형식의 문자열
입력값 형식
- 01 ≤ hh ≤ 12
- 00 ≤ mm, ss ≤ 59
조건
- 모든 입력 값은 유효한 시간 값이다.
결과 값 형식
24 시간제 형식으로 변환해 반환한다.
00 ≤ hh ≤ 23
예시
07:05:45PM
출력
19:05:45
문제 풀이
들어오는 시간 값이 문자열인데 항상 PM 혹은 AM 을 붙인 상태에서 들어오므로 이를 이용해 오전, 오후로 구간대를 나눠서 해결할 수 있어보입니다. 문자열에서 특정한 문자로 끝나는 경우를 조사하고 싶을 땐 endsWith
라는 메소드를 사용하면 간단하지만, Hacker Rank 의 Node 가 해당 메소드를 지원하는지 알 수 없으니 정규식으로 수행합니다. 문제에서 PM / AM 이 대소문자 중 어느것으로 들어올지에 대해 알려주지 않았으므로 모두 검사를 수행하는게 나을 듯 합니다.
풀이의 흐름은 다음과 같습니다.
- 입력 값이 PM 이라는 문자열을 갖고 있는지 확인합니다.
- PM 혹은 AM 을 빈 문자열로 치환 후 문자열을 쪼갭니다.
- 쪼갠 문자 배열 중 가장 앞 부분에 해당하는 시간을 Int 형으로 변환합니다.
- 현재 시간이 12:xxPM , 12:xxAM 중 하나에 해당하는지 검사합니다.
- 각 타임 구간에 맞게 시간을 +12 혹은 -12 연산을 합니다.
- 계산 된 시간이 한 자릿수라면 앞에 0 을 붙여줍니다.
- 쪼갰던 요소를 하나로 합쳐서 반환합니다.
위 과정은 다음과 같습니다.
여기서 우리가 주의해야 할 점은 12 시간제에서 12:00:00PM ~ 12:59:59PM, 12:00:00AM ~ 12:59:59AM 은 24 시간제에서도 12시로 표현한다는 점입니다.
저는 24 시간제를 사용하고 있기 때문에 12 시간제의 이런 예외처리에 대해 많이 헷갈렸네요. 솔직히 지금도 헷갈립니다 ;;
어쨌든, 이 문제는 해당 특정 구간대에만 예외처리를 넣어주면 간단하게 해결할 수 있습니다.