[프로그래머스] lv.1 옹알이(2) (61%)

ayboori·2024년 8월 1일
0

Java Study

목록 보기
30/34

https://school.programmers.co.kr/learn/courses/30/lessons/133499

문제 설명

머쓱이는 태어난 지 11개월 된 조카를 돌보고 있습니다.
조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음과 네 가지 발음을 조합해서 만들 수 있는 발음밖에 하지 못하고 연속해서 같은 발음을 하는 것을 어려워합니다.
문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.

내가 작성한 코드

처음에 오류 발생한 코드

     class Solution {
 String[] babyCanDo = {"aya", "ye", "woo", "ma"};
 int prvNum = -1;
 int answer = 0;
 
 public int solution(String[] babbling) {
     // babbling에 네가지 발음 중 하나라도 포함하는지 체크
     // 포함한다면 해당 문자열을 뺀 뒷 문자열을 다시 체크
     // 앞선 문자열과 같은 문자열은 아니었는지 체크
     
     // 문자열 끝까지 검사했을 시 answer ++
     
     for (String bab : babbling){
         if(babblingCheck(bab)){
             answer ++;
         }
     }
     
     
     return answer;
 }
 
 // babbling 체크 메소드
 private boolean babblingCheck(String babbling){
     boolean flag = false;
     
         if(babbling.length() < 2){
             flag = false;
             return flag;
         }
     
     
     for (String sound : babyCanDo){
         if(babbling.length() < sound.length()){
             continue;
         }
         
         // 할 수 있는 발음을 포함하고 있을 경우
        if (babbling.substring(sound.length()).equals(sound)){
             System.out.println(babbling + "에 " +sound + "포함하고 있음");
            
            flag = true;
            prvNum = i;
            
            // 연속해서 같은 발음 할 시
            if(prvNum == i){
                 System.out.println("연속한 발음 불가");
                flag = false;
                break;
            }
 
            
            // 남은 문자열이 없을 경우 검사 끝
            // if(babbling.length() < babyCanDo[i].length()){
            //      System.out.println("남은 문자열 없음");
            //     break;
            // }
            babblingCheck(babbling.substring(i,babbling.length()));
        }
     }
     
     return flag;
 }
 
}

재귀 함수 사용의 문제 / prvNum의 초기화 문제 등으로 함수 부분을 지우고 다시 작성했다.

완성한 코드

class Solution {
    String[] babyCanDo = {"aya", "ye", "woo", "ma"};
    
    public int solution(String[] babbling) {        
        int answer =0;
        
        // 입력 받은 문자열을 루프를 돌며 함수에 보내서 결과 체크
        for (String bab : babbling){
            if(babblingCheck(bab)){
                answer ++;
            }
        }
        return answer;
    }
    
     private boolean babblingCheck(String babbling) {
        int i = 0; // 인덱스 역할
        String prev = ""; // 이전에 발음할 수 있는 문자열

         // 현재 문자열의 끝까지 검사
        while (i < babbling.length()) {
            boolean matched = false;
            // 발음할 수 있는 문자열 하나씩 체크
            for (String word : babyCanDo) {
                // 문자열이 일치하고, 이전 문자열과 다를 경우
                if (babbling.startsWith(word, i) && !word.equals(prev)) {
                    prev = word;
                    i += word.length(); // 인덱스 이동
                    matched = true;
                    break;
                }
            }
            if (!matched) {
                // 매치하지 않으면 바로 false 리턴
                return false;
            }
        }
        return true;
    }
}

처리 시간

테스트 1 〉	통과 (0.11ms, 74.7MB)
테스트 2 〉	통과 (0.06ms, 70.7MB)
테스트 3 〉	통과 (0.09ms, 81.1MB)
테스트 4 〉	통과 (0.07ms, 73.5MB)
테스트 5 〉	통과 (0.08ms, 73.2MB)
테스트 6 〉	통과 (0.08ms, 72MB)
테스트 7 〉	통과 (0.08ms, 74.2MB)
테스트 8 〉	통과 (0.09ms, 71MB)
테스트 9 〉	통과 (0.04ms, 71.6MB)
테스트 10 〉	통과 (0.02ms, 72.7MB)
테스트 11 〉	통과 (0.13ms, 75.2MB)
테스트 12 〉	통과 (0.09ms, 74.9MB)
테스트 13 〉	통과 (0.07ms, 75MB)
테스트 14 〉	통과 (0.34ms, 75.1MB)
테스트 15 〉	통과 (0.04ms, 86.7MB)
테스트 16 〉	통과 (0.14ms, 76.4MB)
테스트 17 〉	통과 (0.53ms, 74.9MB)
테스트 18 〉	통과 (0.06ms, 66.5MB)
테스트 19 〉	통과 (0.11ms, 71.5MB)
테스트 20 〉	통과 (6.46ms, 76.8MB)

다른 사람의 풀이

1. 일치하는 문자를 치환하기

class Solution {
    public int solution(String[] babblings) {
        // "aya", "ye", "woo", "ma" 4가지 발음만 가능
        int answer = 0;
        for(int i = 0; i < babblings.length; i++) {
        // 두 개 이상 연속할 경우 for문 검사 중지
            if(babblings[i].contains("ayaaya") || babblings[i].contains("yeye") || babblings[i].contains("woowoo") || babblings[i].contains("mama")) {
                continue;
            }

			// 발음할 수 있는 문자열은 모두 공백으로 치환
            babblings[i] = babblings[i].replace("aya", " ");
            babblings[i] = babblings[i].replace("ye", " ");
            babblings[i] = babblings[i].replace("woo", " ");
            babblings[i] = babblings[i].replace("ma", " ");
            
            // 위에서 바로 ""으로 바꿔버리면 치환된 공백을 붙어있는 단어로 인식하기 때문에 이런 루틴 필요
            babblings[i] = babblings[i].replace(" ", "");

			// 치환이 끝나고 난 뒤 남은 문자열이 없으면 정답 ++
            if(babblings[i].length()  == 0) answer++;

        }
        return answer;
    }
}
profile
프로 개발자가 되기 위해 뚜벅뚜벅.. 뚜벅초

1개의 댓글

comment-user-thumbnail
2024년 8월 2일

다른 사람의 답안까지 확인하면서 열심히 공부하고 계시는 군요 👍🏻

답글 달기