프로그래머스 - 옹알이 (2)

박상원·2023년 12월 6일
0

Coding Test

목록 보기
11/18

오늘은 프로그래머스의 옹알이라는 문제를 풀어보았다.
문제 설명은 다음과 같다.

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

제한사항

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

이 문제는 주어진 문자열 중에서 옹알이로 할 수 있는 문자의 갯수를 찾는 문제이다.

처음에 이 문제를 보고 문자열마다 옹알이를 제거해서 전부 제거되면 옹알이를 할 수 있다고 치면 되지 않을까라는 생각을 하였다.
하지만 연속된 옹알이 문자는 할 수 없다는 제약을 보고 풀이를 바꾸기로 결심했다.

다음 풀이는 주어진 문자열 중 문자를 하나씩 확인하여 문자의 첫번째부터 옹알이 문자를 비교하여 일치하는 문자가 있으면 제거하고 다음비교에는 그 옹알이 문자를 비교하지 않고 나머지를 비교하여 제거하고 더이상 제거할 수 없을 때 문자열의 길이를 확인하여 길이가 0이면 answer를 증가시켜주는 방법을 생각해 보았다.

이 방법을 적용해서 문제를 풀어보니 정답이 나왔다.

문제 풀이는 다음과 같다.

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

        for (int i = 0; i < babbling.length; i++) {
            int index = 4;
            for (int j = 0; j < babblingKind.length; j++) {
                if (j != index && babbling[i].length() >= babblingKind[j].length() && babbling[i].substring(0, babblingKind[j].length()).equals(babblingKind[j])) {
                    babbling[i] = babbling[i].substring(babblingKind[j].length());
                    index = j;
                    j = -1;
                }
            }
            if (babbling[i].length() == 0) {
                answer++;
            }
        }

        return answer;
    }
}

우선 옹알이 문자열을 저장하는 문자열 배열을 정의하고 주어진 문자열 배열의 길이만큼 반복문을 돌린다.

반복문 안에서는 다음 비교에 전에 썻던 옹알이 문자를 비교하지 않기 위한 index를 정의해주고 옹알이 문자열배열의 길이만큼 반복문을 돌린다.

여기서 주어진 문자열배열의 문자에 옹알이 문자열 길이만큼 잘라서 옹알이와 비교 후 일치하면 제거하고 index에 j를 저장 후 j를 -1로 변환해준다.

이유는 index로 이전에 사용했던 옹알이를 제외하고 나머지를 처음부터 비교하기 위해서이다.

이 반복문을 빠져나간 뒤 문자열의 길이가 0이면 answer를 증가시켜주고 모든 반복문이 종료 시 옹알이로 할 수 있는 문자열의 갯수 answer를 반환하면 정답을 받을 수 있다.

문제를 풀고 나서 다른 사람들의 풀이를 보니 더 좋은 방법이 존재했다.

그래서 그 풀이를 설명해 주려고 한다.

일단 주어진 문자열의 길이만큼 반복문을 돌려주는 것은 같다.
반복문 안에서 해당 문자열에 연속된 옹알이 문자열이 있다면 해당 문자열은 제외한다.
그리고 반복된 옹알이가 없다면 옹알이 문자를 각각 " "으로 replace를 시키고 마지막에 " "를 ""로 replace 시킨 뒤 문자열의 길이가 0이면 answer를 증가시키는 방법이다.

여기서 옹알이 문자열을 ""가 아닌 " "로 변환하는 이유는 yayae같은 문자열이 있을 수도 있기 때문이다.
해당 문자는 aya를 제거하게 되면 옹알이 문자 ye로 바뀌고 해당 문자도 제거되기 때문이다.

이렇게 모든 문자열을 처리 후 answer를 반환하게 되면 정답이 나오게 된다.

0개의 댓글