해커랭크(Problem Solving)

The Time in Words

감전우 2019. 10. 20. 22:28

문제: The Time in Words

난이도: Medium

 

문제 설명

 시간에 대한 정보(, )가 숫자로 주어지면 이를 토대로 시간을 영어문장으로 나타내라. 형식은 다음과 같다.

문제 해결

소스 코드

    static String timeInWords(int h, int m) {

        int code = 0; // 1: o' clock, 2: past, 3: to

        String hour = null;

        String minute = null;

        String result = null;

 

        if(m == 0) {

            code = 1;

        } else if(m <= 30) {

            code = 2;

        } else {

            code = 3;

        }

 

        if(code == 3) {

            h++;

            m = 60 - m;

        }

 

        hour = toString(h);

        minute = toString(m);

 

        if(m == 1) {

            minute += " minute";

        } else if(m % 15 != 0) {

            minute += " minutes";

        }

 

        switch(code) {

            case 1:

                result = hour + " o' clock"; break;

            case 2:

                result = minute + " past " + hour; break;

            case 3:

                result = minute + " to " + hour; break;

        }

 

        return result;

    }

 

    static String toString(int n) {

        String temp = null;

        switch(n) {

            case 0: temp = ""; break;

            case 1: temp = "one"; break;

            case 2: temp = "two"; break;

            case 3: temp = "three"; break;

            case 4: temp = "four"; break;

            case 5: temp = "five"; break;

            case 6: temp = "six"; break;

            case 7: temp = "seven"; break;

            case 8: temp = "eight"; break;

            case 9: temp = "nine"; break;

            case 10: temp = "ten"; break;

            case 11: temp = "eleven"; break;

            case 12: temp = "twelve"; break;

            case 13: temp = "thirteen"; break;

            case 14: temp = "fourteen"; break;

            case 15: temp = "quarter"; break;

            case 16: temp = "sixteen"; break;

            case 17: temp = "seventeen"; break;

            case 18: temp = "eighteen"; break;

            case 19: temp = "nineteen"; break;

            case 20: temp = "twenty"; break;

            case 30: temp = "half"; break;

            case 40: temp = "forty"; break;

            case 45: temp = "quarter"; break;

            case 50: temp = "fifty"; break;

            default:

                if(n/10*10 == 30) {

                    temp = "thirty";

                } else {

                    temp = toString(n/10*10);

                }

                temp += " ";

                temp += toString(n%10);

        }

        return temp;

    }

 

해설

 이 문제는 어렵지는 않지만 풀이가 다소 번거롭다. 주어진 정보에 따른 분기가 꽤나 많기 때문이다.

 먼저 주어진 정보가 세 가지 형식(o’ clock, past, to)중 어떤 형식에 해당하는가를 파악하였다. to형식의 경우 한국어로 따지면 “XY분전이므로 시 정보를 1 늘렸다.

 그 다음엔 각 숫자 마다 그에 맞는 영어단어를 매치했는데, 그것이 toString() 메소드이다. switch문의 default는 앞의 케이스에 해당되지 않는 수, 다시 말해 20이상 60이하인, 10으로 나누어 떨어지지 않는 수를 영어단어로 변환하는 과정이다. 십의 자리수가 3인 경우를 따로 분리한 이유는 앞에서 30“half”로 매치하게 했기 때문이다.

 분에 대한 정보를 영어로 나타낼 때 1분은 단수이므로 minute이 붙고, 그 외는 minutes가 붙는다.

 앞에서 고려한 요소들을 반영하여 단어들을 조합한 결과를 반환하면 완성이다.