ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] 옹알이 자바 substring
    코딩테스트 2025. 4. 2. 16:05
    반응형

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

     

    프로그래머스

    SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

    programmers.co.kr

     

    문제

    아기는 {"aya", "ye", "woo", "ma"} 4가지 발음만 할 수 있고, 연속해서 같은 발음은 하지 못한다.

    주어진 단어 목록 중에서 아기가 발음할 수 있는 단어의 수를 반환하시오.

    접근

    아기가 낼  수 있는 발음과 단어를 비교하여 발음할 수 있는지 체크하는 로직을 작성해보았다.

    public static int solution2(String[] babbling) {
            int answer = 0;
            String[] anounces = new String[]{"aya", "ye", "woo", "ma"};
            boolean anouncable = false;
            for(String b : babbling){
                String remain = b;
                String front = "";
                String back = "";
                //가능발음 포함여부 체크
                for(String a : anounces){
                    boolean isContain = remain.contains(a);
                    //포함되어 있으면
                    if(isContain){
                        do {
                            int idx = remain.indexOf(a);
                            back = remain.substring(idx).substring(a.length());
                            front = remain.substring(0, idx);
                            anouncable = !back.startsWith(a) && !back.contains(a);
                            remain = front + back;
                            if(remain.isEmpty()) {
                                break;
                            }
                        } while(remain.length() >= a.length());
                    } else {
                        anouncable = false;
                    }
                }
                if(anouncable) answer ++;
            }
            return answer;
        }

     

    발견된 문제

    1.논리 오류:anouncable 변수가 루프 내에서 덮어씌워지며, 마지막 발음 가능 문자열("ma")의 검사 결과만 반영됩니다.모든 발음 가능 문자열을 포함하는지 확인하는 로직이 부정확합니다.
    2.부분 문자열 처리 오류:remain을 업데이트할 때 front와 back을 합치는 방식이 잘못되었습니다.연속된 발음 가능 문자열을 제대로 처리하지 못합니다 (예: "ayaaya"는 불가능해야 함).
    3.종료 조건 부재:remain이 빈 문자열이 될 때까지 모든 경우를 확인하지 않습니다.
    4.효율성 문제:중첩된 루프와 문자열 연산(substring, contains)이 많아 성능이 저하될 수 있습니다.

     

    수정

    1. 유효성여부를 각 단어별로 조사하여 판단하도록 위치를 조정
    2. while문으로 반복처리하도록 하며 단어를 찾으면 해당단어를 제거한 후 바로 뒷 단어가 같은 발음인지 조사.
    3. 모든 조건을 만족하는 경우 answer ++

     

    public static int solution(String[] babbling){
            int answer = 0;
            String[] anounces = new String[]{"aya", "ye", "woo", "ma"};
    
            for(String b : babbling){
                String remain = b;
                boolean isValid = true;
    
                while(!remain.isEmpty() && isValid){
                    boolean found = false;
                    for(String a : anounces){
                    	//해당 발음으로 시작하는가
                        if(remain.startsWith(a)){
                            found = true;
                            remain = remain.substring(a.length());
                            //다음 단어가 연속되는지 확인.
                            if(remain.startsWith(a)){
                                isValid = false;
                            }
                            break;
                        }
                    }
                    if(!found) {
                        isValid = false;
                        break;
                    }
                }
                if(isValid) {
                    answer ++;
                }
    
            }
            return answer;
        }

    알게된 점

    1. 특정 단어의 위치 : index = string.indexOf("특정 단어");
    2. 특정 단어 이후 글자들만 추출 : string.substring(index).substring("특정 단어".length());
    3. 특정 단어 이전 글자들만 추출: string.substring(0, index);
    4. 특정 단어로 시작하는지 확인 : string.startsWith("특정 단어");
    반응형

    댓글

Designed by Tistory.