[4659/실5] 비밀번호 발음하기

YeJong·2025년 8월 7일
0

코딩테스트

목록 보기
3/5

4659/비밀번호 발음하기

https://www.acmicpc.net/problem/4659


💡 첫 접근 방법

  • 문제를 읽고 처음 생각한 풀이 방식
    - 문자열을 문자 배열로 순회하면서 각 규칙을 flag 또는 count 변수로 체크
    - 모음 포함 여부를 체크할 boolean
    - 같은 문자 연속으로 오는지 카운트할 변수 int
    - 이전 문자 현재 문자를 비교하여 연속 변수 체크할 변수 char
  • 자료구조/알고리즘 선택 이유
    - char 배열
  • 예상 시간 복잡도
    - 각 문자열의 최대 길이는 20
    - 전체 입력이 많아도 20자 x N 이므로 O(N)

💻 첫 작성 코드

// Java 예시 코드
import java.io.*;  
  
public class Main {  
    public static void main(String[] args) throws IOException {  
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
  
       while (true) {  
          String input = br.readLine();  
          if (input.equals("end"))  
             break;  
  
          boolean isAccept = true;  
          boolean hasVowel = false;  
          int vowelCount = 0;  
          int nonVowelCount = 0;  
          char lastChar = 0;  
  
          for (int i=0; i<input.length(); i++) {  
             char c = input.charAt(i);  
  
             // 모음 포함 여부  
             if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') {  
                hasVowel = true;  
                vowelCount ++;  
                nonVowelCount = 0;  
             } else {  
                nonVowelCount ++;  
                vowelCount = 0;  
             }  
  
             // 같은 문자 3개 연속 오면 안 됨  
             if (nonVowelCount >= 3 || vowelCount >= 3) {  
                isAccept = false;  
                break;             }  
  
             // 같은 문자 연속 오면 안 됨(e,o 제외)  
             if (i != 0 && c == lastChar) {  
                if (!(c == 'e' || c == 'o')) {  
                   isAccept = false;  
                   break;                
                }  
             }  
             lastChar = c;
          }  
  
          if (!hasVowel) {  
             isAccept = false;  
          }  
  
          if (isAccept) {  
             System.out.println("<" + input + "> is acceptable.");  
          } else {  
             System.out.println("<" + input + "> is not acceptable.");  
          }  
  
       }  
    }  
}

🔍 찾아본 다른 방법

  • 다른 사람의 풀이 또는 검색해서 알게 된 방법
    - 대부분 boolean flag + count 변수 방식으로 조건 나눠 처리했다.
    - 각 조건을 개별 함수로 쪼개는 식의 가독성 개선 코드도 많이 보였다.

📌 회고

  • 아쉬운 점
    - 초안에서 이전 문자와 비교하는 로직을 누락해서 오답 처리
    - 반복 조건이 헷갈려서 count 관리가 복잡했다. (모음이 연속되면 자음 카운트를 초기화 해야하는 등)
  • 배운 점 & 다음에 적용할 개선 포인트
    - 초반에 시간이 걸려도, 각 조건을 완전히 분리하면 최종적으로 점검하거나 디버깅할 때 시간을 단축시켜 총 시간을 줄일 수 있지않을까? 싶었다.
    - 오히려 마구잡이로 코딩을 하게되니 틀리거나 잘못됐을 때 디버깅하기가 쉽지 않았던 것 같다.
    - 코테여도 변수명을 신경써서 짓고, 메서드로 분리(클래스로 분리해야할 필요성은 아직 못느꼈다)하는 연습을 해야할 것 같다.

0개의 댓글