백준 Baekjoon

[C언어] 백준 4659 : 비밀번호 발음하기

sujo 2020. 7. 21. 09:43

백준 4659 : 비밀번호 발음하기

 

문제 링크

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

 

4659번: 비밀번호 발음하기

문제 좋은 패스워드를 만드는것은 어려운 일이다. 대부분의 사용자들은 buddy처럼 발음하기 좋고 기억하기 쉬운 패스워드를 원하나, 이런 패스워드들은 보안의 문제가 발생한다. 어떤 사이트들��

www.acmicpc.net

 

 

문제 내용

(요약) 입력받은 패스워드에 대해 품질을 평가한다.

 

높은 품질을 가진 비밀번호의 조건은 다음과 같다.

  1. 모음(a, e, i, o ,u) 하나를 반드시 포함하여야 한다.
  2. 모음이 3개 혹은 자음이 3개 연속으로 오면 안된다.
  3. 같은 글자가 연속적으로 두번 오면 안되나, ee와 oo는 허용한다.

 

end를 입력하면 프로그램을 종료한다.

 

 

Idea

이번 코드의 핵심은 해당 패스워드가 acceptable인지 아닌지를 판별하는 정수형 변수 accept이다.

default 값으로 accept = 1(true)로 지정하고, 위의 비밀번호 조건에 위배되는 부분을 찾으면 accpet=0(false)로 바꿔 올바른 결과를 출력 할 수 있도록 유도한다.

 

비밀번호 조건을 검사하기 위해 다음과 같은 변수들이 사용되었다.

  • int exist : 모음이 존재하는지 판별
  • int vowel : 모음의 개수 count
  • int consonants : 자음의 개수 count
  • int accept : 비밀번호 품질 판별

 

모음 혹은 자음의 연속되는 개수가 3개 이상인지를 판단하기 위해 vowel(모음)과 consonants(자음)을 사용하였다. 현재 검사하는 문자가 모음이라면 모음에는 1을 추가하고 자음은 0으로 초기화한다. 반대로 문자가 자음이라면 자음에는 1을 추가하고 모음은 0으로 초기화한다.

이런식으로 모음과 자음의 연속되는 개수를 판단할 수 있다.

 

 

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <stdio.h>
#include <string.h>
 
int main() {
    int i, accept, vowel, consonants, exist;
    char pw[21];
    
    while (1) {        
        vowel = consonants = exist = 0;
        accept = 1;
        scanf("%s", pw);
        //문자열이 "end"이면 프로그램 종료
        if (strcmp(pw, "end"== 0break;
        //문자열 검사
        for (i = 0; i < strlen(pw); i++) {
            //모음일 때, 모음++, 자음=0
            //모음이 존재하므로 exist =1
            if (pw[i] == 'a' || pw[i] == 'e' || pw[i] == 'i' || pw[i] == 'o' || pw[i] == 'u') {
                exist = 1;
                vowel++;
                consonants = 0;
            }
            //자음일 때, 자음++, 모음=0
            else {
                consonants++;
                vowel = 0;
            }
            //자음이나 모음의 개수가 3개일 때
            //accept를 0으로 바꾸고 검사 종료
            if (vowel == 3 || consonants == 3) {
                accept = 0;
                break;
            }
            //연속된 단어가 들어올 때,
            if (i < strlen(pw) - 1) {
                //ee나 oo는 통과
                if (pw[i] == 'e'&&pw[i + 1== 'e' || pw[i] == 'o'&&pw[i + 1== 'o'continue;
                //아니라면 accpet를 0으로 바꾸고 검사 종료
                else if (pw[i] == pw[i + 1]) {
                    accept = 0;
                    break;
                }
            }
        }
        //accept=1 이면서 exist=1 인 경우 acceptable, 그외 not acceptable
        if (accept && exist) printf("<%s> is acceptable.\n", pw);
        else printf("<%s> is not acceptable.\n", pw);
    }
    return 0;
}
 

 

 

[출력결과]

 

[정답!]