3 minute read



각 숫자에 대응되는 영단어 표

숫자 영단어
0 zero
1 one
2 two
3 three
4 four
5 five
6 six
7 seven
8 eight
9 nine


입출력 예시

Input-1
“one4seveneight”
Output-1
1478

Input-2
“23four5six7”
Output-2
234567

Input-3
“2three45sixseven”
Output-3
234567

Input-4
123
Output-4
123


문제 풀이

이 문제는 두가지 방법으로 풀어보았다.
먼저 각 영단어마다 대응되는 조건을 노가다로 작성하는 방법으로 풀어보았다.
그런데 코드가 너무 길고 가독성이 나쁜 것 같아 줄일 수 있는 방법중 모색하던중 replace()을 활용하여 간결하게 줄일 수 있었다.
이 두가지 풀이 모두 알아보자.

노가다 작성 풀이

주어진 문자열의 0부터 0까지의 영단어별로 확인하기 위해 switch문을 활용하였다.
각 영단어의 첫 인덱스 문자 z(0), o(1), t(2,3), f(4,5), s(6,7), e(8), n(9) 별로 검증하였고,
영단어가 아닌 숫자의 경우는 숫자 그대로 반환할 수 있도록 하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
for(int i=0; i<s.length(); i++) {
    switch(s.charAt(i)) {
        case 'z':
            if(s.charAt(i+1)=='e' && s.charAt(i+2)=='r' && s.charAt(i+3)=='o') {
                temp += "0";
                i+=3;
                break;
            }
        case 'o':
            if(s.charAt(i+1)=='n' && s.charAt(i+2)=='e') {
                temp += "1";
                i+=2;
                break;
            }
        case 't':
            if(s.charAt(i+1)=='w' && s.charAt(i+2)=='o') {
                temp += "2";
                i+=2;
                break;
            }
            else if(s.charAt(i+1)=='h' && s.charAt(i+2)=='r' && s.charAt(i+3)=='e' && s.charAt(i+4)=='e') {
                temp += "3";
                i+=4;
                break;
            }
        case 'f':
            if(s.charAt(i+1)=='o' && s.charAt(i+2)=='u' && s.charAt(i+3)=='r') {
                temp += "4";
                i+=3;
                break;
            }
            else if(s.charAt(i+1)=='i' && s.charAt(i+2)=='v' && s.charAt(i+3)=='e') {
                temp += "5";
                i+=3;
                break;
            }
        case 's':
            if(s.charAt(i+1)=='i' && s.charAt(i+2)=='x') {
                temp += "6";
                i+=2;
                break;
            }
            else if(s.charAt(i+1)=='e' && s.charAt(i+2)=='v' && s.charAt(i+3)=='e' && s.charAt(i+4)=='n') {
                temp += "7";
                i+=4;
                break;
            }
        case 'e':
            if(s.charAt(i+1)=='i' && s.charAt(i+2)=='g' && s.charAt(i+3)=='h' && s.charAt(i+4)=='t') {
                temp += "8";
                i+=4;
                break;
            }
        case 'n':
            if(s.charAt(i+1)=='i' && s.charAt(i+2)=='n' && s.charAt(i+3)=='e') {
                temp += "9";
                i+=3;
                break;
            }
        default:
            temp += s.charAt(i);
            break;
    }
}

위 코드를 보면 알겠지만 읽기 짜증날 정도로 길다..

replace() 활용 풀이

앞에서 푼 코드 길이를 대폭 줄일 수 있는 방법이 있다..!
바로 replace() 메서드를 이용하는 것이다.

먼저 0부터 9까지의 영단어 배열을 하나 만들어준다.

1
String[] alph = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

그리고 이 영단어 배열을 순회하며 replace()를 활용해 입력문자열에 존재하는 영단어를 숫자로 변환할 수 있다.

1
2
3
for(int i=0; i<alph.length; i++) {
    s = s.replace(alph[i], String.valueOf(i));
}

이렇게 위 switch문에 비하면 너무나 간결한 코드로 작성할 수가 있다.


작성 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import java.util.*;

class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();

        long start = System.currentTimeMillis();
        solutio2(s);
        long end = System.currentTimeMillis();
        System.out.println("\n수행시간 = " + (end-start));
    }
    public static int solution1(String s) {
        String temp = "";
        for(int i=0; i<s.length(); i++) {
            System.out.println(s.charAt(i));
            switch(s.charAt(i)) {
                case 'z':
                    if(s.charAt(i+1)=='e' && s.charAt(i+2)=='r' && s.charAt(i+3)=='o') {
                        temp += "0";
                        i+=3;
                        break;
                    }
                case 'o':
                    if(s.charAt(i+1)=='n' && s.charAt(i+2)=='e') {
                        temp += "1";
                        i+=2;
                        break;
                    }
                case 't':
                    if(s.charAt(i+1)=='w' && s.charAt(i+2)=='o') {
                        temp += "2";
                        i+=2;
                        break;
                    }
                    else if(s.charAt(i+1)=='h' && s.charAt(i+2)=='r' && s.charAt(i+3)=='e' && s.charAt(i+4)=='e') {
                        temp += "3";
                        i+=4;
                        break;
                    }
                case 'f':
                    if(s.charAt(i+1)=='o' && s.charAt(i+2)=='u' && s.charAt(i+3)=='r') {
                        temp += "4";
                        i+=3;
                        break;
                    }
                    else if(s.charAt(i+1)=='i' && s.charAt(i+2)=='v' && s.charAt(i+3)=='e') {
                        temp += "5";
                        i+=3;
                        break;
                    }
                case 's':
                    if(s.charAt(i+1)=='i' && s.charAt(i+2)=='x') {
                        temp += "6";
                        i+=2;
                        break;
                    }
                    else if(s.charAt(i+1)=='e' && s.charAt(i+2)=='v' && s.charAt(i+3)=='e' && s.charAt(i+4)=='n') {
                        temp += "7";
                        i+=4;
                        break;
                    }
                case 'e':
                    if(s.charAt(i+1)=='i' && s.charAt(i+2)=='g' && s.charAt(i+3)=='h' && s.charAt(i+4)=='t') {
                        temp += "8";
                        i+=4;
                        break;
                    }
                case 'n':
                    if(s.charAt(i+1)=='i' && s.charAt(i+2)=='n' && s.charAt(i+3)=='e') {
                        temp += "9";
                        i+=3;
                        break;
                    }
                default:
                    temp += s.charAt(i);
                    break;
            }
        }
        int answer = Integer.parseInt(temp);
        return answer;
    }
    public static int solution2(String s) {
        String[] alph = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
        for(int i=0; i<alph.length; i++) {
            s = s.replace(alph[i], String.valueOf(i));
        }
        int answer = Integer.parseInt(s);
        return answer;
    }
}

회고

  • 문자열을 변환하는 과정에서 어떻게 접근해야 할지 익숙해진 것 같고, 코드의 가독성을 위해 고민하고 더 좋은 코드를 작성할 수 있었다.