development

Hackerrank 알고리즘 퀴즈 The Time in Words 파이썬 풀이 및 해설

Hackerrank 알고리즘 퀴즈 The Time in Words 파이썬 풀이 및 해설

Hackerrank 알고리즘 퀴즈인 The Time in Words 파이썬으로 풀고 설명해드리겠습니다.

문제 출처 : 해커랭크로이동

풀이 소스 깃허브에서 보기 : 깃허브로 이동


문제 요약

Given the time in numerals we may convert it into words, as shown below:


5:00 처럼 숫자가 시간이 주어졌을때 word 로 변환하는 문제입니다. 단순하게 숫자 증가만 되지 않고 여러가지 예외처리를 입맛에 맞게 해주면 되겠습니다.

솔루션
출력부분 텍스트는 숫자 -> 문자를 dict로 key value 쌍을 활용한다.
분이 00 인 경우는 정각으로 o' clock 으로 표시한다.
숫자가 1인 경우만 minute 단수 표시를 한다.
15 / 45 는 quater, 30분은 half 로 분기한다.
위에 해당하지 않고 30분 미만인 경우는 시간 + fast 처리를 한다.
20분 이상인 경우는 10분단위, 1분단위를 나눠서 표시한다.
30분이 넘어가는 경우는 분을 60분에서 빼고, 시간을 + 1 시킨다.
위에 조건도 포함한다.

풀이
#!/bin/python3

import math
import os
import random
import re
import sys

# Complete the timeInWords function below.



def timeInWords(h, m):
    dict = {
        1:'one',
        2:'two',
        3:'three',
        4:'four',
        5:'five',
        6:'six',
        7:'seven',
        8:'eight',
        9:'nine',
        10:'ten',
        11:'eleven',
        12:'twelve',
        13:'thirteen',
        14:'fourteen',
        15:'quarter',
        16:'sixteen',
        17:'seventeen',
        18:'eighteen',
        19:'nineteen',
        20:'twenty',
        30:'half',
    }

    if m == 00:
        return dict[h]+" o' clock"
    elif int(m) == 1:
        return dict[int(m)]+' minute past '+dict[h]
    elif int(m) in (15, 30):
        return dict[int(m)]+' past '+dict[h]
    elif int(m) <= 20:
        return dict[int(m)]+' minutes past '+dict[h]
    elif 20 < int(m) < 30:
        return dict[20]+' '+dict[int(m)-20]+' minutes past '+dict[h]
    elif int(m) == 45:
        return dict[15] + ' to ' + dict[h+1]
    elif int(m) < 60:
        conv_m = 60 - int(m)
        if 20 < conv_m < 30:
            return dict[20] + ' ' + dict[conv_m-20] + ' minutes to ' + dict[h+1]
        else:
            return dict[conv_m] + ' minutes to ' + dict[h+1]




if __name__ == '__main__':
    fptr = open(os.environ['OUTPUT_PATH'], 'w')

    h = int(input())

    m = int(input())

    result = timeInWords(h, m)

    fptr.write(result + '\n')

    fptr.close()


썩 좋지 못한 코드네요. 그냥 참고용으로 쓰시기만 바라겠습니다. 분명 버그가 있을겁니다 ^^;

풀고나니 그냥 dict로 다 처리해버리는 것은 어떨까 생각도 되긴 합니다. 시간관련 다양한 생각을 해볼 수 있을 것 같네요. 예제에는 없었지만, noon, midnight 등의 추가적인 처리도 사실 더 필요할 것 같네요.