[JAVA] 프로그래머스 (Lv.1) 숫자 문자열과 영단어

AIR·2023년 8월 21일
0

링크

https://school.programmers.co.kr/learn/courses/30/lessons/81301


문제 설명

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.

다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.

  • 1478 → "one4seveneight"
  • 234567 → "23four5six7"
  • 10203 → "1zerotwozero3"

이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.

참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.

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

제한사항

  • 1 ≤ s의 길이 ≤ 50
  • s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
  • return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.

입출력 예

sresult
"one4seveneight"1478
"23four5six7"234567
"2three45sixseven"234567
"123"123

나의 코드

class Solution {
    public int solution(String s) {
        String[] num_String = {"zero", "one", "two", "three", "four", "five",
                "six", "seven", "eight", "nine"};
        String[] num = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
        StringBuilder sb = new StringBuilder(s);

		//String 클래스의 matches 메소드 이용
        //인자로 주어진 정규식에 매칭되는 값이 있느냐에 따라 boolean 값 반환
        //정규식에서 \d 는 0~9 사이의 숫자를 의미하며 [0-9]로 쓸수도 있다
        //+는 앞의 표현식이 1개 이상 있다는 의미
        //주어진 문자열에 숫자만 있을때까지 while문을 반복하며
        //num_String 배열의 원소와 동일한 값이 있으면 그에 맞는 숫자로 대체한다
        //그리고 indexOf 메소드에서 해당 값을 찾지 못 할 경우 -1를 반환하기 때문에
        //if문을 이용하여 continue를 수행 (if문이 없을시 StringIndexOutOfBoundsException)
        while (!sb.toString().matches("\\d+")) {
            for (int i = 0; i < num.length; i++) {
                int idx = sb.indexOf(num_String[i]);
                if (idx < 0) {
                    continue;
                }
                sb.replace(idx, idx + num_String[i].length(), num[i]);
            }
        }
        return Integer.parseInt(sb.toString());
    }
}

다른 사람의 풀이

class Solution {
    public int solution(String s) {
        String[] strArr = {"zero", "one", "two", "three", "four",
        		"five", "six", "seven", "eight", "nine"};
        //주어진 문자열에 배열의 원소가 있으면 i 값을 String으로 변환해서 모두 대체한다
        for (int i = 0; i < strArr.length; i++) {
            s = s.replaceAll(strArr[i], Integer.toString(i));
        }
        return Integer.parseInt(s);
    }
}

정리

처음에는 주어진 문자열을 어떻게 숫자와 문자열로 구분해야 될지 고민이 많았는데
split()을 쓸 수도 없고..
그래서 문자열 숫자 알파벳 배열과 문자열 숫자 배열을 만든 뒤
for문을 돌려서 주어진 문자열에 배열 원소가 있을 경우 숫자로 대체하였다.
하지만 for문이라 s가 동일한 단어가 여러 개 있거나 오름차순이 아닐 경우 제대로 된 결과가 나오지 않아서
while문으로 문자열에 숫자가 없을 때까지 계속 for문을 돌리는 식으로 코드를 작성하였는데
그 과정에서 정규식 사용 방법도 알게 되고, indexOf 메소드에서 찾기를 실패할 경우 -1을 반환한다는 것도 알게 되었지만
다른 사람의 풀이를 보니까 너무 간단했다..
단지 숫자 단어 배열만 만들어둔 뒤 숫자는 for문의 i를 이용하였고
replaceAll 메소드로 모든 단어를 숫자로 대체할 수 있었다.


참고

자바 정규식 사용법 :
https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%A0%95%EA%B7%9C%EC%8B%9DRegular-Expression-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%A0%95%EB%A6%AC

profile
백엔드

0개의 댓글