숫자 문자열과 영단어

coha96 ㅣ 2023. 3. 22. 04:51

문제

네오와 프로도가 숫자놀이를 하고 있습니다. 

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

 

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

이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다.

s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.

 

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

※ 제한사항

· 1 ≤ s의 길이 ≤ 50

· s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.

· return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.

 

 

입출력 예 설명

 

입출력 예 #1

· 문제 예시와 같습니다.

 

입출력 예 #2

· 문제 예시와 같습니다.

 

입출력 예 #3

· "three"는 3, "six"는 6, "seven"은 7에 대응되기 때문에 정답은 입출력 예 #2와 같은 234567이 됩니다.

· 입출력 예 #2와 #3과 같이 같은 정답을 가리키는 문자열이 여러 가지가 나올 수 있습니다.

 

입출력 예 #4

· s에는 영단어로 바뀐 부분이 없습니다.


작성 코드

class Solution {
    public int solution(String s) {
        String[] str = {"zero", "one", "two", "three", "four",
        "five", "six", "seven", "eight", "nine"};
        for (int i = 0; i < str.length; i++) {
            s = s.replaceAll(str[i], Integer.toString(i));
        }
        return Integer.parseInt(s);
    }

    public static void main(String[] args) {
        Solution st = new Solution();

        int result = st.solution("one4seveneight9two");
        System.out.println(result);
    }
}


replace() / replaceAll() 사용법 및 차이

■ String replace(CharSequence target, CharSequence replacement)

replace() 함수의 첫 번째 인자 값은 변환하고자 하는 대상이 되는 문자열이다. 

두 번째 인자 값은 변환할 문자 값이다.

 

(예제 1)

앞에서부터 순차적으로 "aa"라는 문자 값이 있을 경우 "b"로 치환하기 때문에 아래와 같은 결과 값을 출력한다.

class Solution {
    public static void main(String[] args) {
        String str1 = "aaaa";
        System.out.println("result : " + str1.replace("aa", "b"));
    }
}

 

(예제 2)

치환하고자 하는 문자열이 "바 코"로 공백 문자를 포함한 문자열이다.

이를 "good"으로 치환하면 결과는 아래와 같다.

class Solution {
    public static void main(String[] args) {
        String str1 = "자바 코딩";
        System.out.println("result : " + str1.replace("바 코", "good"));
    }
}

■ String replaceAll(String regex, String replacement)

replaceAll() 함수는 replace() 함수와 같이 첫 번째 인자 값은 변환하고자 하는 대상이 되는 문자열이며,

두 번째 인자 값은 변환 할 문자 값이다.

위에서 사용한 replace()를 replaceAll()로 바꾸고 출력하게 되면 replace()의 출력 값과 동일한 출력 값을 얻는다.

 

위 예제를 보면 두 함수 간의 차이점은 없어 보인다.

자세하게 차이점을 알아보자.

 

■ replace() vs replaceAll()

두 함수의 가장 큰 차이점은 입력 인자 값의 형이 replace()는 CharSequence이고 replaceAll()는 String이라는 것이다.

여기서 String이라는 것은 regular expression 즉, 정규표현식이라고 부르는 형식의 인자 값을 사용할 수 있다는 것이다.

 

class Solution {
    public static void main(String[] args) {
        String str1 = "abcdefghijk";
        System.out.println("result : " + str1.replaceAll("[abchij]", "굿"));
    }
}

replaceAll의 첫 번째 인자 값으로 입력한 [abchij]라는 값은 정규표현식 값으로 의미하는 바는 a, b, c, h, i, j라는 값을 모두 의미한다.

즉, 상기 값들을 모두 "굿"이라는 문자열로 변환하겠다는 의미이다.

 

class Solution {
    public static void main(String[] args) {
        String str1 = "abcdefghijk";
        System.out.println("result : " + str1.replaceAll("[^abchij]", "굿"));
    }
}

정규표현식에 "^"라는 값이 들어가면 반대로 a, b, c, h, i, j를 제외한 모든 문자를 "굿"으로 변환하겠다는 의미이다.

 

replace() 함수를 사용하여 위 replaceAll() 함수와 같은 결과 값을 가져오기 위해서는 아래와 같이 더 많은 코드를 작성해야 하고 보기에도 더 불편하다.

class Solution {
    public static void main(String[] args) {
        String str1 = "abcdefghijk";
        System.out.println("result : " + str1.replace("a", "굿")
                .replace("b", "굿")
                .replace("c", "굿")
                .replace("h", "굿")
                .replace("i", "굿")
                .replace("j", "굿"));
            }
}

그래서 replace() 함수도 많이 사용되지만 불특정 입력 값을 변환하고자 할 경우 replaceAll() 함수를 사용하는 것이 좋을 것 같다.

replace() 함수는 많이 사용해봤지만 replaceAll() 함수는 처음 써본 것 같다. 두 함수 사용처가 약간 다르므로 우선 이정도 이해하고 넘어가는 걸로 .. 

'코딩테스트' 카테고리의 다른 글

미완/백준 2830 행성 X3  (0) 2023.03.22
백준 9012 괄호  (0) 2023.03.22
코테 입문 - (수학)짝수는 싫어요  (0) 2023.03.21
미완/백준 24174 힙 정렬  (0) 2023.03.21
미완/백준 1158 요세푸스 순열  (0) 2023.03.21