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)
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;
}
}
다른 사람의 답안까지 확인하면서 열심히 공부하고 계시는 군요 👍🏻