[프로그래머스, Java] 옹알이 (2)

2025. 7. 18. 18:57·CodingTest/Programmers

사진을 클릭하면 해당 문제로 이동

💡풀이

import java.util.Arrays;

class Solution {
    public int solution(String[] babbling) {
        // 발음할 수 있는 단어 목록
        String[] canBabbles = {"aya", "ye", "woo", "ma"};

        for (int i = 0; i < babbling.length; i++) {

            while (true) {
                String match = "";

                // 발음 가능한 단어로 시작하는지 확인
                for (String canBabble : canBabbles) {
                    if (babbling[i].startsWith(canBabble)) {
                        match = canBabble; // 일치하는 단어를 찾으면 저장 후 종료
                        break;
                    }
                }

                // 1. 더 이상 일치하는 발음이 없으면 다음 단어로 이동
                if (match.isEmpty()) {
                    break;
                }

                // 2. 연속으로 같은 발음을 하는 경우(예: "yeye")는 불가능하므로 중단
                if (babbling[i].substring(match.length()).startsWith(match)) {
                    break;
                }

                // 일치하는 발음을 단어에서 제거 (문자열을 잘라냄)
                babbling[i] = babbling[i].substring(match.length());
            }
        }

        // 빈 문자열이 된 단어(완전히 발음 가능한 단어)의 개수를 반환
        return (int) Arrays.stream(babbling)
                .filter(String::isEmpty)
                .count();
    }
}

💡풀이 2

- 두번 연속으로 발음하는 케이스를 먼저 체크하고 반복문 순회하기

import java.util.Arrays;

class Solution {
    public int solution(String[] babbling) {
        String[] speak = {"aya", "ye", "woo", "ma"};
        String[] speakTwoTime = {"ayaaya", "yeye", "woowoo", "mama"};

        A: for (int i = 0; i < babbling.length; i++) {

            // 두번 연속으로 발음하는 경우 체크
            for (String s : speakTwoTime) {
                if (babbling[i].contains(s)) {
                    continue A;
                }
            }

            for (String s : speak) {
                // 공백(" ")으로 변환하여 단어 삭제로 인해 새로운 문자가 생성되지 않도록 주의
                babbling[i] = babbling[i].replace(s, " ");
            }
        }

        return (int) Arrays.stream(babbling)
                .filter(String::isBlank).count();
    }
}

📖새로 배운 부분

1️⃣replace 시 공백(" ") 으로 변환한 이유

의도치 않은 문자열 결합 방지

- replace(word, "")는 단어를 제거한 후, 남은 문자열 조각들을 합쳐버립니다.
이 과정에서 원래는 없었던 새로운 유효 단어가 생성될 수 있습니다.

예시: "wyeoo"에서 "ye"를 제거하면 "woo"가 되어버립니다.

 

2️⃣replace 랑 replaceAll 둘다 모두 변경하는데 똑같은거아니야?

- 결론부터 말씀드리면, replaceAll()은 정규표현식(Regex)을 사용하고, replace()는 일반 문자열(Literal String)을 사용합니다.

String str = "hello.world";

 '.'을 일반 문자로 인식
String result1 = str.replace(".", "!"); // "hello!world"

'.'을 '임의의 한 글자'라는 패턴으로 인식
String result2 = str.replaceAll(".", "!"); // 결과: "!!!!!!!!!!!"

정규식에서 특수문자를 일반문자로 쓰려면 이스케이프(\\) 해야 함
String result3 = str.replaceAll("\\.", "!"); // 결과: "hello!world"

 

 

replace : 바꾸려는 대상이 고정된 문자열일 때 (예: "apple", " ", "\n")

replaceAll : 패턴으로 문자를 찾고 싶을 때 (예: "[0-9]"  "[^p]" 등등)

 

상황에 따라서 사용하도록 합시다!!


 

GitHub - okjunghyeon/Programmers_CodingTest: 프로그래머스 관련 코딩테스트 문제를 풀이한 저장소입니다.

프로그래머스 관련 코딩테스트 문제를 풀이한 저장소입니다. Contribute to okjunghyeon/Programmers_CodingTest development by creating an account on GitHub.

github.com

 

'CodingTest > Programmers' 카테고리의 다른 글

[프로그래머스, Java][PCCE 기출문제] 9번 / 지폐 접기  (0) 2025.07.18
[프로그래머스, Java] 실패율  (0) 2025.07.18
[프로그래머스, Java] 소수 만들기  (0) 2025.07.18
[프로그래머스, Java] 소수 찾기  (0) 2025.07.18
[프로그래머스, Java] 과일 장수  (0) 2025.07.18
'CodingTest/Programmers' 카테고리의 다른 글
  • [프로그래머스, Java][PCCE 기출문제] 9번 / 지폐 접기
  • [프로그래머스, Java] 실패율
  • [프로그래머스, Java] 소수 만들기
  • [프로그래머스, Java] 소수 찾기
devoks
devoks
꾸준히 작성해보자!
  • devoks
    ok's 개발 블로그
    devoks
  • 전체
    오늘
    어제
    • 분류 전체보기 (110) N
      • Backend (15)
        • SpringBoot (0)
        • Java (15)
      • Cs (17) N
      • Infra (0)
        • AWS (0)
        • Docker (0)
      • CodingTest (78)
        • Programmers (78)
  • 링크

    • My GitHub
  • 인기 글

  • 태그

    BufferedReader
    switch
    StringTokenizer
    programmers
    codingtest
    java
    effectivejava
    BufferedWriter
    json
    CS
  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
devoks
[프로그래머스, Java] 옹알이 (2)
상단으로

티스토리툴바