[프로그래머스] 숫자 문자열과 영단어

fsm12·2023년 6월 7일
0

프로그래머스

목록 보기
4/57
post-thumbnail
post-custom-banner

문제링크

문제 이해

[ 입력형태 / 조건 ]

s
실제 숫자나 영어로 표기한 숫자들을 문자열로 나타낸 것 | "one4seveneight"

[ 문제 ]

=> 문자열 s에 속한 영어를 다 숫자로 치환하여 return

[ 풀이 ]

영어를 숫자로 replace



코드

> [성공] 1차 시도 : i+"" 사용

  • 생각한 풀이 그대로 구현
class Solution {
    public int solution(String s) {
        String[] nums = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
        for(int i=0; i<10; i++){
            s = s.replace(nums[i], i+"");
        }
        return Integer.parseInt(s);
    }
}


=> 해당 영어 문자열이 없어도 다 replace 연산을 하기 때문에, 실행 시간이 크게 나왔다고 생각됨. 하지만 contains를 쓰면 O(N)만큼 더 스캔을 하기 때문에 더 오버헤드적인 연산일 것이므로 다른 방법을 고민해봐야겠음..
=> Integer.toString() 또는 String.valueOf() 연산을 쓰면 시간을 단축시킬 수 있었다

>> [성공] 1차 시도 변형 : Integer.toString() / String.valueOf() 사용

  • Integer.toString()
  • String.valueOf()

< 참고 >

Integer.toString()와 String.valueOf()는 null을 예외로 띄우는가 "null"이라는 문자열로 가지고 있는지의 차이를 가지므로, String.valueOf()를 사용하는 것이 좋다.


> [성공] 2차 시도

  • replace 메소드를 이용하지 않고 구현, StringBuilder를 이용
class Solution {
    public int solution(String s) {
        StringBuilder ans = new StringBuilder();
        StringBuilder eng_num = new StringBuilder();

        for (char ch : s.toCharArray()) {
            if (Character.isDigit(ch)) {
                ans.append(ch);
            } else {
                eng_num.append(ch);
                if (eng_num.length() >= 3) {
                    String word = eng_num.toString();
                    switch (word) {
                        case "zero":
                            ans.append("0");
                            eng_num = new StringBuilder();
                            break;
                        case "one":
                            ans.append("1");
                            eng_num = new StringBuilder();
                            break;
                        case "two":
                            ans.append("2");
                            eng_num = new StringBuilder();
                            break;
                        case "three":
                            ans.append("3");
                            eng_num = new StringBuilder();
                            break;
                        case "four":
                            ans.append("4");
                            eng_num = new StringBuilder();
                            break;
                        case "five":
                            ans.append("5");
                            eng_num = new StringBuilder();
                            break;
                        case "six":
                            ans.append("6");
                            eng_num = new StringBuilder();
                            break;
                        case "seven":
                            ans.append("7");
                            eng_num = new StringBuilder();
                            break;
                        case "eight":
                            ans.append("8");
                            eng_num = new StringBuilder();
                            break;
                        case "nine":
                            ans.append("9");
                            eng_num = new StringBuilder();
                            break;
                    }
                }
            }
        }
        return Integer.parseInt(ans.toString());
    }
}



TIP : int형을 String으로 바꾸는 연산에는 숫자+"" 보다 String.valueOf(숫자)가 훨씬 효율적인 방법이다

post-custom-banner

0개의 댓글