생각정리/코딩테스트

[JAVA][Level1]PROGRAMMERS 옹알이 (2)

생각중임 2023. 8. 23. 22:27

 

옹알이 (2)


문제 설명

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

제한사항

  • 1 ≤ babbling의 길이 ≤ 100
  • 1 ≤ babbling[i]의 길이 ≤ 30
  • 문자열은 알파벳 소문자로만 이루어져 있습니다.

입출력 예

babbling result
["aya", "yee", "u", "maa"] 1
["ayaye", "uuu", "yeye", "yemawoo", "ayaayaa"]
2

입출력 예 설명

입출력 예 #1

["aya", "yee", "u", "maa"]에서 발음할 수 있는 것은 "aya"뿐입니다. 따라서 1을 return합니다.

입출력 예 #2

["ayaye", "uuuma", "yeye", "yemawoo", "ayaayaa"]에서 발음할 수 있는 것은 "aya" + "ye" = "ayaye", "ye" +

"ma" + "woo" = "yemawoo"로 2개입니다. "yeye"는 같은 발음이 연속되므로 발음할 수 없습니다. 따라서 2를 return합니다.

주어진 문제

class Solution {
    public int solution(String[] babbling) {
        int answer = 0;
        return answer;
    }
}

나의 문제풀이

class Solution {
    public int solution(String[] babbling) {
        int answer = 0;
        String[] wording = {"aya", "ye", "woo", "ma"};

        // babbling을 순회하면서 확인을 한다.
        for (int i = 0; i < babbling.length; i++) {
            // wording을 순회히면서 발음에 맞는 옹아리가 있을 경우 숫자로 변경해 표시해준다.
            for (int j = 0; j < wording.length; j++) {
                babbling[i] = babbling[i].replaceAll(wording[j], String.valueOf(j+1));
            }
        }

        // 발음을 표시한 옹아리를 순회한다.
        for (String str : babbling) {
            // 숫자로만 표시 되어 있으면 옹아리가 발음 할 수 있는 것
            if (str.matches("^[\\d]*$")) {
                // 같은 발음은 연속하지 못하기 때문에 연속 된 숫자를 제외하고 횟수를 헤아린다.
                if (str.contains("11")) continue;
                else if (str.contains("22")) continue;
                else if (str.contains("33")) continue;
                else if (str.contains("44")) continue;
                else answer++;
            }
        }

        return answer;
    }
}
  • 주어진 할 수 있는 발음을 wording배열로 선언한다.
  • babbling배열을 for-loop로 반복한다.
  • wording배열을 for-loop로 순회하면서 해당 발음이 babbling에 포함되어 있으면 지정한 문자로 변경해 준다. (문제에서는 j+1 값으로 1, 2, 3, 4로 변경)
  • 발음이 변경된 babbling배열을 for-each로 반복한다.
  • matches() 함수로 정규식을 사용해서 처음부터 끝까지 숫자로 표현된 문자를 확인하고 숫자로만 되어 있다면 같은 발음은 연속으로 못하기 때문에 연속된 숫자를 제외한 문자열만 헤아린다.

배열이나 리스트를 사용해서도 풀 수 있을 거 같은데 문자로 된 문제는 문자열로 풀어보는 게 다양하게 사용해 볼 수 있어서 문자열을 그대로 사용하는 방법을 선택했다.
다른 문제들의 풀이들을 봤을 때 replaceAll()을 사용했던 문제들이 기억나 변경하여 변경된 문자열들을 확인해서 걸러내면 되겠다고 생각했다.
그리고 가끔씩 사용해 보는 정규식을 이용하여 구분하고 분류하여 문제를 풀었다.
정규식은 사용할 때마다 사용 문법을 까먹어서 계속 검색하면서 만들고 있는데 차츰 사용하다 보면 검색을 안 하고 사용을 할 수 있지 않을까 싶다.

 

 

문제 출처 - https://school.programmers.co.kr/learn/courses/30/lessons/133499