[Programmers] Lv0 옹알이(1)(2) JAVA

2023. 1. 17. 23:03CS/자료구조 & 알고리즘

728x90

문제 출처

[프로그래머스 코딩 테스트 연습] https://school.programmers.co.kr/learn/courses/30/lessons/120956

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 풀이

이 문제는 다음 단계로 나뉜다.

1. 주어진 발음 중에서 아기가 말할 수 있는 단어를 검사

2. 같은 단어를 반복하는지 검사

3. 1~2를 통과한 발음은 성공한 발음

4. 3에서 성공한 발음들만 더한다.

 

주어진 발음중에서 앞부분만 아기가 말할 수 있는 단어를 검사

아기가 발음을 할 수 있는 단어는 "aya", "ye", "woo", "ma" 이렇게 총 4가지이다.

첫 번째로 아기가 말할 수 있는 단어는 주어진 단어에서 앞에 있는 단어가 위 단어인지 비교하면 된다.

향후 반복문으로 활용하기 쉽게 하기 위해서 함수로 만들었다.

검사 삭제를 반복하면 주어진 문제에서 연속된 문장은 말할 수 없다를 제외하고 검사가 가능하다.

 

자세한 코드 설명

더보기

코드 설명

for each 문으로 검사하기 위해서 String 배열을 만들었으며

앞에 있는 단어를 비교하기 위해 startsWith(String)을 이용하여 검사하였다.

검사해서 성공하면 해당 단어를 return 하고 아니라면 향후 if 문으로 길이를 비교할 수 있게 빈 문자열을 반환하도록 하였다.

// 머쓱이가 첫 단어를 말 할 수 있는지 검사하는 함수
public String getBabyCanWord(String str) {
    for (String babyCanWord : new String[] {"aya", "ye", "woo", "ma"})
        if (str.startsWith(babyCanWord))
            return babyCanWord;

    return "";
}

 

머쓱이가 연속되도라도 발음을 말할 수 있는지 확인하는 함수의 설명

주어진 발음을 첫 단어를 말할 수 있는지 확인 후 없다면 머쓱이가 발음을 할 수 없는 것이다.

만약 말할 수 있다면 말할 수 있는 단어를 주어진 발음에서 삭제를 진행한다.

위 두가지를 주어진 발음의 길이가 0 보다 클 때만 진행을 한다.

 

자세한 코드 설명

더보기

코드설명

빈번한 삭제가 일어날 것을 예상하여 StringBuilder을 이용하여 주어진 발음을 저장한다.

저장한 후 babySay의 길이가 0보다 클 때만 반복을 진행을 한다.

머쓱이가 첫 단어를 말할 수 있는지를 babyWord에 저장을 하고 

if 문으로 그 길이가 0 즉 머쓱이가 말할 수 없다면 향후 count를 하지 않게 하기 위해서 0을 반환한다.

만약 말할 수 있다면 babySay.delete(0, babyWord.length());로 해당 말한 것을 지운다.

말할 수 있다면 말할 수 있는 것을 지움으로써 while 문에서 빠져나오며 이때 count 하기 위해서 1을 반환한다.

// 머쓱이가 연속해서라도 말할 수 있는지 검사하는 함수
public int getSayCount(String str) {
    StringBuilder babySay = new StringBuilder(str);

    while (babySay.length() > 0) {
        String babyWord = getBabyCanWord(babySay.toString());

        if (babyWord.length() == 0) return 0;

        babySay.delete(0, babyWord.length());
    }

    return 1;
}

 

같은 단어를 반복하는지 검사(성공한 발음 조사)

같은 단어를 반복하는 것을 검사하는 것은 간단하다.

미리 String 변수를 만든 후 반복문 마지막에 추가하면 된다. 

이제 이 변수와 첫 번째로 차례로 말하는 단어를 비교하면 된다. 

 

더 자세한 코드 설명

더보기

코드설명

머쓱이가 연속되도라도 발음을 말할 수 있는지 확인하는 함수에서

반복 문 전에 같은 단어를 반복하는지 여부를 확인하기 위한 변수 saveBabyWord를 빈 문자열로 저장한다.

빈문자열을 저장하는 이유는 머쓱이가 말할 수 있는 단어들은 빈문자열이 아니기 때문이다.

이후 if문을 이용하여 머쓱이가 말할 수 있는 단어를 저장한 babyWord와 저장한 babyWord를 비교 후 같다면 0을 반환하여 향후 count 되지 않게 하기 위해 추가한다.

마지막으로 while문에 saveBabyWord를 지속적으로 갱신해 주면 된다.

// 머쓱이가 말할 수 있는지 검사하는 함수
public int getSayCount(String str) {
    StringBuilder babySay = new StringBuilder(str);

    String saveBabyWord = ""; // 추가

    while (babySay.length() > 0) {
        String babyWord = getBabyCanWord(babySay.toString());

        if (babyWord.length() == 0) return 0;
        if (saveBabyWord.equals(babyWord)) return 0;  // 추가

        babySay.delete(0, babyWord.length());
        saveBabyWord = babyWord; // 추가
    }

    return 1;
}

 

성공한 발음들 Count

for 이용하여 babbling을 탐색하면서 getSayCount(str) 함수로 count를 하면 된다.

public int solution(String[] babbling) {
    int answer = 0;

    for (String b : babbling) 
        answer += getSayCount(b);

    return answer;
}

 

소스코드

public class Solution {
	
	public String getBabyCanWord(String str) {
		for (String babyCanWord : new String[] {"aya", "ye", "woo", "ma"})
			if (str.startsWith(babyCanWord))
				return babyCanWord;
		
		return "";
	}
	
	public int getSayCount(String str) {
		StringBuilder babySay = new StringBuilder(str);
			
		String saveBabyWord = "";
		
		while (babySay.length() > 0) {
			String babyWord = getBabyCanWord(babySay.toString());
			
            if (babyWord.length() == 0) return 0;
			if (saveBabyWord.equals(babyWord)) return 0;
			
			babySay.delete(0, babyWord.length());
			saveBabyWord = babyWord;
		}
		
		return 1;
	}
	
	public int solution(String[] babbling) {
		int answer = 0;
		
		for (String b : babbling) 
			answer += getSayCount(b);
		
        return answer;
    }
}

 

 

728x90