※ 본 포스팅은 프로그래머스에 있는 연습문제 풀었던 내역을 아카이빙하기 위해 작성했습니다.

 

처음에 이 문제를 접하고 정말 어려웠었는데

 

"이게 왜 도대체 난이도 0이란 말인가?" 라는 생각을 했는데

 

최종 답안이 통과되는 순간에는

 

"아 이 정도면 난이도를 높게 설정할 수는 없겠구나"라는 생각이 들었다.

 

결론을 먼저 이야기하자면

 

Java의 "문자열 배열"과 문자열에서 특정한 문자를 "삭제하는 방법"을 알 수 있었다면

 

훨씬 접근이 간단해지는 문제였다.

 

(혹시나 답이 필요해서 여기까지 오신 분은 밑에 스크롤하지 마시고 다시 풀러가보세요)

 

 

 

            /*
            1. "aya", "ye", "woo", "ma" 네가지 발음이 들어가있다면
            처음 들어간 문자열을 지워냅니다. (replaceFirst)
            1-1. 여기에서 문자열을 비교했을 때 1번을 실행한 문자라면 같은 문자만 연속해서 존재하는지 
            (연속해서 존재한다면 지워내고 indexOf가 0인지 체크하면 되지 않을까?)
            1-2. 전 단계에서 indexOf로 실행한 결과가 0이 나오는 애들은 카운팅을 안하고 비활성화하고 싶다.
            (연속해서 같은 발음을 하는 것을 어려워한다.)
            비활성화하고 싶다고? 최후에 문자열 배열이 0이 되는 애들만 출력하고 싶다면
            aya ye woo ma 네가지로는 지워지지 않는 문자열을 끝에 삽입하면 되지 않을까?
            
            2. 위의 단계를 전부 다 통과했다면 
            aya ye woo ma 에 해당하는 문자열을 " 전 부 " 지워준다.
            
            3. 위의 단계를 전부 다 통과했다면 
            문자열의 길이가 0인지 체크하여 여기에서 0이라면 answer를 +1 해준다!
            */

 

이렇게 프로그램들이 할 기능들을 정리해주니 머리속이 한결 좋아졌다.

 

그래도 처음에 냈던 답안은 너무나도 길었었는데 처음에 냈던 답안은 다음과 같다.

 

class Solution {
    public int solution(String[] babbling) {
        int answer = 0;
        int i = 0;
        for(i = 0; i<babbling.length; i++){
            if(babbling[i].indexOf("aya") != -1 ){
                babbling[i] = babbling[i].replaceFirst("aya","");
                if(babbling[i].indexOf("aya")==0) {
             	  babbling[i] = babbling[i].concat("z");
             	}
            }
            if(babbling[i].indexOf("ye") != -1){
               babbling[i] = babbling[i].replaceFirst("ye","");
               if(babbling[i].indexOf("ye")==0) {
            	  babbling[i] = babbling[i].concat("z");
               }
            }
            if(babbling[i].indexOf("woo") != -1){
                babbling[i] = babbling[i].replaceFirst("woo","");
                if(babbling[i].indexOf("woo")==0) {
             	  babbling[i] = babbling[i].concat("z");
                }
            }
            if(babbling[i].indexOf("ma") != -1){
                babbling[i] = babbling[i].replaceFirst("ma","");
                if(babbling[i].indexOf("ma")==0) {
             	   babbling[i] = babbling[i].concat("z");
                }  
            } 
            
            babbling[i] = babbling[i].replace("aya","");       
			babbling[i] = babbling[i].replace("ye","");	        
			babbling[i] = babbling[i].replace("woo","");  
			babbling[i] = babbling[i].replace("ma","");
            if(babbling[i].length()==0) answer++;
		}

        return answer;
    }
}

 

위의 코드는 정말이지 단순무식하게 모든 과정을 하나하나 그려가면서 프로그램을 짰던 흔적이 보인다(...)

다시 보니 코드가 중복되는 문구가 너무 많기도 하고 비효율적이었다.

 

그렇게 복잡한 코드로 해도 일단 테스트는 통과였다

이미 정답은 맞췄지만 더 짧고 간결하게 수정하기로 했다.

 

 

 

class Solution {
    public int solution(String[] babbling) {
        int answer = 0;
        int i = 0;
        String [] bab = {"aya", "ye", "woo", "ma"};
        for(i = 0; i<babbling.length; i++){
            for(int j = 0;j<bab.length;j++){
                if(babbling[i].indexOf(bab[j]) != -1 ){
                    babbling[i] = babbling[i].replaceFirst(bab[j],"");
                    if(babbling[i].indexOf(bab[j])==0) {
                      babbling[i] = babbling[i].concat("z");
                    }
                }
                babbling[i] = babbling[i].replace(bab[j],"");
            }
            if(babbling[i].length()==0) answer++;
		}

        return answer;
    }
}

 

역시 고대의 티스토리 블로거들과

스택 오버플로우는 너무나도 최고다...

 

여러 도움을 얻어서 여기까지 코드를 줄이는데 성공했다.

 

위 코드에서 문자열을 전부 bab 이라는 문자열 배열을 생성해서 넣고

각 문자는 문자열 bab을 호출해서 반복문에 넣어서 차례대로 비교할 수 있도록 변경했다.

 

그렇게 해서 모든 과정을 다 거치고 조건을 만족한 입력값만 answer 값을 증가시키도록 하면 된다.

+ Recent posts