[C++] 백준 4659번 풀이 ( 비밀번호 발음하기 )

정민경·2024년 1월 2일
0

baekjoon

목록 보기
51/57
post-thumbnail

- 문제 ( 4659번 ) : 비밀번호 발음하기

  • 다음 3가지의 조건을 모두 만족하는 비밀번호인지 확인해 출력하는 프로그램 작성.
    1. 모음( a, e, i, o, u ) 하나 이상 반드시 포함.
    2. 모음이 3개 혹은 자음이 3개 연속으로 오면 안됨.
    3. 같은 글자가 연속적으로 두번 오면 안되나, ee, oo 는 허용

- 입력 및 출력

[ 입력 ]

  • 입력은 "end" 문자열을 입력하기 전까지 계속해서 testcase 입력.
  • 각 testcase 는 한줄로 이루어져 있으며, test 할 비밀번호 입력.
  • 각 비밀번호는 한글자 이상 20글자 이하의 문자열이며, 대문자 포함 x

[ 출력 ]

  • 각 testcase 를 "예제출력" 형태에 기반하여 품질 평가 출력.
    => 조건에 만족하는 비밀번호 : "<비밀번호> is acceptable."
    => 조건에 만족하지않는 비밀번호 : "<비밀번호> is not acceptable."

- 문제 풀이

  • 나는 문제에서 주어진 각 조건을 확인하는 함수를 하나씩 만들어 3가지 조건이 모두 true 인 경우 조건에 만족, 하나라도 false 인 경우 조건에 만족하지 않는다 판별해 출력해주었다.

  • 모음에 따라 조건을 판별하는 경우가 많으므로 모음 5가지 저장되어있는 char 배열 하나 선언해서 이 각각과 비교해 조건을 판별해주었다.


- 최종 코드

#include <iostream>
#include <string>

char vowels[5] = {'a', 'e', 'i', 'o', 'u'};

// case1
bool check_include_vowel(std::string s) {
  for(int i = 0; i < s.size(); i++) {
    for(int j = 0; j < 5; j++) {
      bool found = s[i] == vowels[j];
      if (found) {
        return true;
      }
    }
  }

  return false;
}

// case2
bool check_conti_three_letters(std::string s) {
  int v_count = 0; // the number of consecutive vowels
  int c_count = 0; // the number of consecutive consonants

  for(int i = 0; i < s.size(); i++) {
    bool exist = false;
    for(int j = 0; j < 5; j++) {
      exist = (s[i] == vowels[j]);
      if(exist) {
        v_count += 1;
        c_count = 0;
        break;
      } 
    }

    // not exist vowel
    if(!exist) {
      v_count = 0;
      c_count += 1;
    }

    // terminate condition
    if(v_count >= 3 || c_count >= 3) {
      return false;
    }
  }

  return true;
}

// case3
bool check_conti_two_letters(std::string s) {
  int count = 1;
  char prev_letter = s[0];

  for(int i = 1; i < s.size(); i++) {

    // terminate condition
    if(prev_letter == s[i] && prev_letter != 'e' && prev_letter != 'o') {
      return false;
    }

    prev_letter = s[i];
    count = 1;
  }

  return true;
}

void print_result(bool total_condition, std::string s) {
  if (total_condition) {
    std::cout << "<" << s << "> is acceptable." << std::endl;
  } else {
    std::cout << "<" << s << "> is not acceptable." << std::endl;
  }
}

int main() {
  std::string input = "";

  while(true) {
    std::cin >> input;
    
    if(input.compare("end") == 0) {
      break;
    }

    bool case1 = check_include_vowel(input);  
    bool case2 = check_conti_three_letters(input);  
    bool case3 = check_conti_two_letters(input);

    bool total_cond = case1 && case2 && case3;
    print_result(total_cond, input);
  }

  return 0;
}

0개의 댓글