[코팅테스트연습] 코딩테스트 입문 > Lv.0 옹알이(1)

2024. 3. 13. 10:15코딩 테스트/[프로그래머스] Java

문제 설명


문제 풀이

주어진 문자열 내부에 원하는 문자열이 들어있는지 확인하고, 원하는 문자열과 비슷하지만 다른 문자열인지도 확인해야 한다.

포함 유무를 확인하기 위해서는 이전에 string.contains()를 이용해서 참 거짓을 확인할 수 있다. 

하지만 예를 들어서 "aya"를 말할 수 있는데, "ayaa"라는 문자열인 경우 count를 올리면 안된다.

따라서..

문자를 하나씩 가져와서 원하는 문자열이 들어있으면 그 부분은 공백으로 대체하고, 나머지 문자열에 대해서 다시 비교하면서 마지막 빈 문자열이 될 때까지 찾아내면 될 것 같다고 생각한다.

class Solution {
    public int solution(String[] babbling) {
        int answer = 0;
        for(String word: babbling){
            while(word.length>0){
                if((word.contains("aya")) word.replace("aya","");
                   else if((word.contains("ye")) word.replace("ye","")
                }
            }
        }
        return answer;
    }
}

근데 이렇게 하나씩 작성을 하던 중, 문득 떠오른 생각이 있다.

포함되는 걸 찾아서 해당 글자를 공백으로 바꿔버리면, 중간에 존재하는 글자가 사라질 수도 있다고 생각했고

그로 인해서 이상한 단어가 결과로 생성될 수 있다고 생각했다.

따라서 contains가 아닌 startsWith 함수를 사용하기로 하였다.

 

class Solution {
    public int solution(String[] babbling) {
        int answer = 0;
        int count = 4;
        for(String word: babbling){
            while(count>0){
                if(word.startsWith("aya")) word = word.substring(3);
                else if(word.startsWith("ye")) word =word.substring(2);
                else if(word.startsWith("woo")) word =word.substring(3);
                else if(word.startsWith("ma")) word =word.substring(2);
                count--;
                if(word.length() != 0){
                   System.out.println(word);
                    break;
                }else if(word.length() == 0){
                    answer += 1;
                    break;
                }
            }
        }
        return answer;
    }
}

또 이렇게 작성하다가 이런 생각이 들었다!!!

생각해보니 저번에 공부했던 자바의 String에 대해서..

String은 수정 불가능한 객체이다!! 기존의 word를 내가 수정할 수 없던 것이다 ....!

그렇다면.. 어떻게 word를 가지고 문제를 해결해나갈 수 있을까?

 

class Solution {
    public int solution(String[] babbling) {
        int answer = 0;
        for (String word : babbling) {
            int count=4;
            StringBuilder str = new StringBuilder(word);
            while (count >= 0) { 
                if (str.toString().startsWith("aya")) str.delete(0, 3);
                else if (str.toString().startsWith("ye")) str.delete(0, 2);
                else if (str.toString().startsWith("woo")) str.delete(0, 3);
                else if (str.toString().startsWith("ma")) str.delete(0, 2);
                count--;
                
                if (str.length() == 0){answer++; break;}
                else if(count==0 & str.length()!=0) break;
            }
            
        }
        return answer;
    }
}

수정 가능한 객체인 StringBuilder를 사용한 다음, 문자열을 비교할 땐 String에 있는 메소드를 사용하고자 

toString() 을 사용하였다.

즉, 수정이 필요한 곳에서만 StringBuilder 객체를 사용하여 진행하였다!

 

이전에 파이썬으로 한번 푼 적이 있는 문제여서 점수를 얻지 못했다..!

 

근데 다른 사람 풀이를 보던 도중, replace를 사용해서 string의 하나의 index는 바꾸어질 수 있다는 것을 보았다!

수정 불가능하다는 것이 제대로 어느 정도의 수정인지 더 자세히 알아보아야 겠다.