-
[프로그래머스] 옹알이 자바 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("특정 단어");반응형'코딩테스트' 카테고리의 다른 글
[프로그래머스] 삼총사 자바 (0) 2025.04.02 [프로그래머스] 콜라 문제 자바 (0) 2025.04.02 [프로그래머스] 햄버거 만들기 자바 : 스택 (0) 2025.04.01 [프로그래머스] 푸드 파이트 대회 자바 (0) 2025.04.01 [프로그래머스] 과일 장수 자바 최소값 계산 : 내림차순 정렬 (0) 2025.04.01