코딩 테스트 준비-숫자 문자열과 영단어

Adam·2022년 3월 19일
0

코딩 테스트

목록 보기
2/3
post-thumbnail

주중에 릴리즈 때문에 바빠서 코딩 테스트 준비가 조금 소홀해졌지만, 주말에는 적어도 한문제씩은 풀고 기술 블로그에 해당 내용을 올려보려고 한다.
오늘 풀어봤던 문제는 2021년 카카오 채용연계형 인턴십 기출 문제로 프로그래머스 기준으로 레벨 1이었고, 지난번 풀었던 레벨 1 문제 보다는 훨씬 수월하였다.

문제

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

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

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

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

풀이

Brute-force와 정규표현식을 활용해 쉽게 풀 수 있던 문제였다.

풀이 로직을 설명하자면 다음과 같다.
1. s를 split해 array로 만들어준다.
2. 코드의 효율성을 위해 스트링빌더를 생성해준다.
3. array를 순환하면서 숫자 정규표현식에 맞으면 스트링빌더에 그대로 append.
4. 정규 표현식에 맞지 않는 다면 텍스트이기 때문에 텍스트에 맞는 값에 해당하는 값을 append 해주고 순회 번호(i)를 올바르게 올려준다.(ex. array[i]가 z였다면 zero값이 들어간 것이기 떄문에 스트링 빌더에 0을 더해주고 i값에 3을 더해준다.)
5. 스트링빌더를 스트링으로 바꾼 값을 정수로 바꿔 반환해준다.

import java.util.*;
import java.util.regex.Pattern;

class Solution {
    public int solution(String s) {
        StringBuilder answerBuilder = new StringBuilder();
        String[] array = s.split("");
        String pt = "^[0-9]+$";
        for(int i=0; i<array.length; i++){
            if(Pattern.matches(pt, array[i])==true){
                answerBuilder.append(array[i]);
            }
            else{
                if(array[i].equals("z")){
                    i+=3;
                    answerBuilder.append(0);
                }
                else if(array[i].equals("o")){
                    i+=2;
                    answerBuilder.append(1);
                }
                else if(array[i].equals("t")){
                    if(array[i+1].equals("w")){
                        i+=2;
                        answerBuilder.append(2);
                    }else{
                        i+=4;
                        answerBuilder.append(3);
                    }
                }
                else if(array[i].equals("f")){
                    if(array[i+1].equals("o")){
                        i+=3;
                        answerBuilder.append(4);
                    }else{
                        i+=3;
                        answerBuilder.append(5);
                    }
                    
                }
                else if(array[i].equals("s")){
                    if(array[i+1].equals("i")){
                        i+=2;
                        answerBuilder.append(6);
                    }else{
                        i+=4;
                        answerBuilder.append(7);
                    }
                }
                else if(array[i].equals("e")){
                    i+=4;
                    answerBuilder.append(8);
                }
                else{
                    i+=3;
                    answerBuilder.append(9);
                }
                
            }
            
        }
        return Integer.parseInt(answerBuilder.toString());
    }
}

다른 사람의 풀이

다른 사람의 풀이를 보니 훨씬 replaceAll 메써드를 활용해 훨씬 더 간결한 해결방안을 제시하였다.

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

로직은 다음과 같다
1. strArr에 순차적으로 0~9에 해당하는 숫자의 스트링 값을 넣어준다.
2. strArr의 replaceAll을 활용해 배열에서 zero값 부터 nine까지 순차적으로 0~9로 변환해준다.

느낀점

이번 문제는 나도 비교적 수월하게 풀었다고 생각했는데, replaceAll 메써드로 훨씬 수월하게 풀 수 있다는 사실에 감탄했다. 조금씩 공부해 나가면서 보다 효율적, 그리고 간결한 코드를 배워 나가야 할 것 같다.

profile
Keep going하는 개발자

0개의 댓글