백준 4659 비밀번호 발음하기 JAVA 풀이 (구현, 문자열, O(L))

2026. 4. 1. 13:34·코테(Solved.ac + Programmers)
728x90

🔗 문제 링크

문제 링크: https://www.acmicpc.net/problem/4659


📌 문제 개요

백준 4659번 비밀번호 발음하기는
주어진 문자열이 좋은 비밀번호인지 판별하는 문제

  • 모음(a, e, i, o, u)이 최소 1개 이상 포함되어야 한다.
  • 모음이 3개 연속으로 오면 안 된다.
  • 자음이 3개 연속으로 오면 안 된다.
  • 같은 글자가 연속으로 2번 오면 안 된다.
  • 단, ee와 oo는 허용된다.

입력은 여러 줄로 주어지고, "end"가 입력되면 종료


📌 접근 방법

문자열을 앞에서부터 한 글자씩 보면서 조건을 검사하면 해결

  1. 모음이 한 번이라도 등장했는지
  2. 모음 또는 자음이 3번 연속되는지
  3. 같은 문자가 연속되는지

문자 하나를 볼 때마다 현재 문자가 모음인지 자음인지 구분하고,

  • 모음이면 vowelCnt 증가, consonantCnt 초기화
  • 자음이면 consonantCnt 증가, vowelCnt 초기화

이 방식으로 연속 개수를 관리

또한 현재 문자와 이전 문자가 같다면 연속 문자이므로 예외 여부를 확인
이때 e, o는 허용되므로 제외 처리


📌 핵심 아이디어

이 문제의 핵심은 문자열을 순회하면서 상태를 관리하는 것

1. 모음 포함 여부 확인

좋은 비밀번호는 반드시 모음을 하나 이상 포함
따라서 모음을 만날 때마다 hasVowel = true로 체크해두고,
문자열 검사가 끝난 뒤에도 false라면 좋은 비밀번호가 아닙니다.

2. 모음/자음 연속 개수 관리

모음 3개 연속, 자음 3개 연속을 막아야 하므로
모음과 자음의 연속 개수를 각각 따로 관리

  • 현재 문자가 모음이면 vowelCnt++, consonantCnt = 0
  • 현재 문자가 자음이면 consonantCnt++, vowelCnt = 0

이렇게 하면 현재 흐름이 모음인지 자음인지 바로 알 수 있고,
둘 중 하나가 3이 되는 순간 즉시 실패 처리

3. 같은 문자 연속 검사

이전 문자와 현재 문자가 같다면 원칙적으로 좋은 비밀번호가 아닙니다.
하지만 ee, oo는 허용되므로, 이 조건으로 예외까지 함께 처리

if (prev == ch && ch != 'e' && ch != 'o')
 

📌 전체 코드

package no_4659;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class No4659 {

    public static boolean isVowel(char ch) {
        return ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u';
    }

    public static boolean isAcceptable(String str) {
        boolean hasVowel = false;
        int vowelCnt = 0;
        int consonantCnt = 0;

        for (int i = 0; i < str.length(); i++) {
            char ch = str.charAt(i);

            if (isVowel(ch)) {
                hasVowel = true;
                vowelCnt++;
                consonantCnt = 0;
            } else {
                consonantCnt++;
                vowelCnt = 0;
            }

            if (vowelCnt >= 3 || consonantCnt >= 3) {
                return false;
            }

            if (i > 0) {
                char prev = str.charAt(i - 1);
                if (prev == ch && ch != 'e' && ch != 'o') {
                    return false;
                }
            }
        }

        return hasVowel;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        while (true) {
            String str = br.readLine();

            if (str.equals("end")) {
                break;
            }

            if (isAcceptable(str)) {
                sb.append("<").append(str).append("> is acceptable.").append("\n");
            } else {
                sb.append("<").append(str).append("> is not acceptable.").append("\n");
            }
        }

        System.out.print(sb);
    }
}

📄 정리

백준 4659번은 복잡한 알고리즘 문제라기보다
문자열을 순차적으로 검사하는 구현 문제

  • 모음이 하나 이상 있는지 확인
  • 모음/자음이 3번 연속되는지 확인
  • 같은 문자가 연속되는지 확인 (ee, oo 예외)
728x90

'코테(Solved.ac + Programmers)' 카테고리의 다른 글

백준 16435 스네이크버드 JAVA 풀이 (그리디, 정렬)  (0) 2026.04.03
백준 1652 누울 자리를 찾아라 JAVA 풀이 (구현, 문자열, 완전탐색, 시간복잡도)  (0) 2026.04.02
백준 9625 BABBA JAVA 풀이 (DP, 피보나치, O(N))  (0) 2026.03.31
백준 10826 피보나치 수 4 JAVA 풀이 (DP, BigInteger, 시간복잡도)  (0) 2026.03.30
백준 24262 알고리즘 수업 - 알고리즘의 수행 시간 1 JAVA 풀이 (수학, 시간복잡도)  (0) 2026.03.29
'코테(Solved.ac + Programmers)' 카테고리의 다른 글
  • 백준 16435 스네이크버드 JAVA 풀이 (그리디, 정렬)
  • 백준 1652 누울 자리를 찾아라 JAVA 풀이 (구현, 문자열, 완전탐색, 시간복잡도)
  • 백준 9625 BABBA JAVA 풀이 (DP, 피보나치, O(N))
  • 백준 10826 피보나치 수 4 JAVA 풀이 (DP, BigInteger, 시간복잡도)
PUSH → MERGE → DEPLOY
PUSH → MERGE → DEPLOY
데이터 흐름과 운영 자동화를 설계하는 백엔드 개발자
  • PUSH → MERGE → DEPLOY
    Coding Dongin
    PUSH → MERGE → DEPLOY
  • 전체
    오늘
    어제
    • MEUN N
      • 코테(Solved.ac + Programmers) N
      • BootCamp(JAVA)
      • JAVA
      • SpringBoot
      • JavaScript
      • JSP
      • DB(SQL)
      • React
      • HTML_CSS
      • jQuery
      • SCSS
      • GSAP
      • 설치 + 꿀팁
      • 정보처리기사 오답노트
      • 정보처리기사 기출문제
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GIT
  • 공지사항

  • 인기 글

  • 태그

    자바
    Level2
    level1
    프로그래머스
    실기
    정처기
    브루트포스
    구현
    정보처리기사
    백엔드개발자
    코딩테스트
    springboot
    알고리즘
    자료구조
    정처기실기
    완전탐색
    수학
    solved.ac
    기출문제
    dp
    정보처리기사 실기 기출문제
    java
    정렬
    배열
    시뮬레이션
    문자열
    정처기오답노트
    피보나치
    백준
    level0
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.4
PUSH → MERGE → DEPLOY
백준 4659 비밀번호 발음하기 JAVA 풀이 (구현, 문자열, O(L))
상단으로

티스토리툴바