프로그래머스 - 숫자 문자열과 영단어(Level 1)

2024. 1. 2. 21:31코딩테스트 정리(자바)

728x90

내 풀이

class Solution {
    public int solution(String s) {
        StringBuilder sb=new StringBuilder();
        String str="";
        for(char ch:s.toCharArray()){
            if(!Character.isAlphabetic(ch)) {//숫자라면
                sb.append(ch); //담기
                continue;
            }
            //문자라면 str에 이어붙힘
            str+=Character.toString(ch);
            switch(str){
                case "zero":{
                        sb.append("0"); 
                        str=""; //str초기화
                        break;
                    }
                case "one":{
                        sb.append("1"); 
                        str=""; //str초기화
                        break;
                    }
                case "two":{
                        sb.append("2"); 
                        str=""; //str초기화
                        break;
                    }
                case "three":{
                        sb.append("3"); 
                        str=""; //str초기화
                        break;
                    }
                case "four":{
                        sb.append("4"); 
                        str=""; //str초기화
                        break;
                    }
                case "five":{
                        sb.append("5"); 
                        str=""; //str초기화
                        break;
                    }
                case "six":{
                        sb.append("6"); 
                        str=""; //str초기화
                        break;
                    }
                case "seven":{
                        sb.append("7"); 
                        str=""; //str초기화
                        break;
                    }
                case "eight":{
                        sb.append("8"); 
                        str=""; //str초기화
                        break;
                    }
                case "nine":{
                        sb.append("9"); 
                        str=""; //str초기화
                        break;
                    }
                default:
                    continue;
            } 
        }
        int answer = Integer.parseInt(sb.toString());
        return answer;
    }
}

 

1. Character.isAlphabetic(ch)
: ch값이 문자(알파벳 또는 한글)라면 true, 아니라면 false를 반환하는 메서드

 


책에서의 깔끔한 풀이

: 각 숫자를 나타내는 영단어를 배열에 보관하고

배열을 순회하며 s에 word [i] 단어가 있다면 해당 숫자의 문자열로 바꾼다.

그 후 전체 문자를 숫자로 변환한다.

 

시간복잡도는 words의 길이 m 만큼 순회하며

replace() 메서드를 실행한다.

원본 문자열 s의 길이를 n이라 할 때, replace() 메서드는 O(n)의 시간복잡도를 가진다.

-> O(mn)

public class Solution {
    private static final String[] words = {
            "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine",
    };

    public int solution(String s) {
        for (int i = 0; i < words.length; i++) {
            s = s.replace(words[i], Integer.toString(i)); 
        }

        return Integer.parseInt(s);
    }
}

 

 

1. replace([기존문자], [바꿀문자])
: 문자열에 존재하는 기존 문자열을 다른 문자열로 바꿔서 반환

(char 타입도 가능하고 CharSequence 타입도 가능하다. CharSequence는 인터페이스이고 String 클래스, StringBuilder 클래스를 가지고 있다.

따라서 String 타입과 StringBuilder 타도 가능.)

replaceAll([정규식], [바꿀문자])
:replace() 메서드와 기능은 동일하나 첫 번째 인자 값으로 정규식이 들어간다

(String 타입만 가능)

 

String a = "무궁화. 삼천리. 화려강산. 대한사람. 대한으로. 길이. 보전하세 ";
//replace([기존문자],[바꿀문자])
a = a.replace(".", "/");
System.out.println(a);

//결과값 : 무궁화/ 삼천리/ 화려강산/ 대한사람/ 대한으로/ 길이/ 보전하세

 

SString a = "무궁화. 삼천리. 화려강산. 대한사람. 대한으로. 길이. 보전하세 ";
//replaceAll([정규식],[바꿀문자])
a = a.replaceAll(".", "/");
System.out.println(a);

//결과값 : /////////////////////////////////////

 

-> 정규식에서 "."은 모든 문자를 의미하기 때문에 모든 문자가 바뀐다.

 

 

 

2. Integer.toString(i)

: int 타입의 숫자 i를 문자열로 변환한다.

Integer.parseInt(str)의 반대 기능을 한다.

728x90