[Java] 프로그래머스(level-1) - 숫자 문자열과 영단어

각 숫자에 대응되는 영단어 표
숫자 | 영단어 |
---|---|
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;
}
}
회고
- 문자열을 변환하는 과정에서 어떻게 접근해야 할지 익숙해진 것 같고, 코드의 가독성을 위해 고민하고 더 좋은 코드를 작성할 수 있었다.