[프로그래머스 / JAVA] Level 1 숫자 문자열과 영단어 (81301)
게시글
⏰ 2021-12-14 02:21:04
D O W N

D O W N
랭크 | 사용 언어 |
---|---|
Level 1 | JAVA |
네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.
참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.
숫자 | 영단어 |
---|---|
0 | zero |
1 | one |
2 | two |
3 | three |
4 | four |
5 | five |
6 | six |
7 | seven |
8 | eight |
9 | nine |
s | result |
---|---|
one4seveneight | 1478 |
23four5six7 | 234567 |
2three45sixseven | 234567 |
123 | 123 |
입출력 예 #1
문제 예시와 같습니다.
입출력 예 #2
문제 예시와 같습니다.
입출력 예 #3
"three"는 3, "six"는 6, "seven"은 7에 대응되기 때문에 정답은 입출력 예 #2와 같은 234567이 됩니다.
입출력 예 #2와 #3과 같이 같은 정답을 가리키는 문자열이 여러 가지가 나올 수 있습니다.
입출력 예 #4
s에는 영단어로 바뀐 부분이 없습니다.
숫자의 영소문자를 전부 숫자로 변경하여, 최종적으로 int 형태로 반환하는 알고리즘을 구현해야한다.
위 두 과정을 거치면 된다. 여러 방법이 있지만, 이왕 JAVA 쓰는거, enum 객체를 활용하여 구현하고자 한다.
비교적 쉬운 로직에 생소한 패턴을 적용해보는 것도 연습에 도움이 된다.
JAVA
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
private enum Number { ZERO("0"), ONE("1"), TWO("2"), THREE("3"), FOUR("4"), FIVE("5"), SIX("6"), SEVEN("7"), EIGHT("8"), NINE("9"); private final String num; Number(String num) { this.num = num; } public String getNum() { return num; } }
enum은 위와 같이 설계한다. Number.ONE.name().toLowerCase()를 활용하여 one 문자열을 얻을 수 있다. 또한 Number.ONE.getNum()를 활용하여 이에 one에 매칭되는 숫자 1을 얻을 수 있다. 이 두 메서드를 활용하여 문자열을 치환한다.
JAVA
1 2 3 4
for (Number number : Number.values()) { answer = answer.replaceAll(number.name().toLowerCase(), number.getNum()); }
Number.values()로 Number의 모든 요소를 배열 형태로 반환받을 수 있다. for문을 통해 각 숫자의 영문자에 해당하는 문자를 이에 매칭되는 숫자로 치환한다. replaceAll을 활용하여 해당하는 모든 문자들을 치환할 수 있다.
int 변환은 Integer.parseInt() 메서드를 활용하자.
JAVA
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
/** * 숫자 문자열과 영단어 클래스 * * @author RWB * @since 2021.12.06 Thu 18:47:19 */ class Solution { /** * 해답 반환 메서드 * * @param s: [String] 문자열 * * @return [int] 해답 */ public int solution(String s) { String answer = s; for (Number number : Number.values()) { answer = answer.replaceAll(number.name().toLowerCase(), number.getNum()); } return Integer.parseInt(answer); } /** * 숫자 enum */ private enum Number { ZERO("0"), ONE("1"), TWO("2"), THREE("3"), FOUR("4"), FIVE("5"), SIX("6"), SEVEN("7"), EIGHT("8"), NINE("9"); private final String num; /** * 생성자 메서드 * * @param num: [String] 숫자 */ Number(String num) { this.num = num; } /** * 숫자 반환 메서드 * * @return [String] 숫자 */ public String getNum() { return num; } } }
enum이 싫다면 Map이나 배열 같이 친숙한 형태로도 구현할 수 있다.
예를 들어, int nums[] = new int[] { "zero", "one" ... "nine" };과 같은 코드는 배열의 인덱스와 그 값을 통해 동일한 로직을 구성할 수 있다.
nums[0] = "zero"이므로, 인덱스와 값을 적절히 사용하여 치환하는 것도 가능하다.
🏷️ Related Tag