[Python] 백준 4659번 - 비밀번호 발음하기

유빈·2025년 1월 10일
0

Algorithms

목록 보기
22/35
post-thumbnail

백준 문제집 PS

ses0028님의 "IT기업 및 대기업 계열사 코테보면서 비슷했던 문제들(지속적으로 업데이트 중)"

이번 방학 2달동안 골드 3 (81문제)까지 다 푸는 것이 목표입니다.

25.01.10 - 실버 5 1문제
(14/81문제)

문제문제 제목문제 티어문제 링크풀이 링크
4659비밀번호 발음하기실버 5https://www.acmicpc.net/problem/4659🔗


🔗 문제 링크

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


⏰ 소요된 시간

40분



🛡️ 난이도

실버 5



✨ 수도 코드

1. 문제 이해

높은 품질의 비밀번호 조건

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

2. 코드 분석

input = open(0).readline

def seq2(current_w):  # 2개 연속된 같은 문자가 오는 경우 검사
    global cnt
    # oo, ee의 경우
    if (current_w == 'o' or current_w == 'e') and cnt == 1:
        cnt = 2
        return False  # 높은 비밀번호 O
    else:
        return True  # 높은 비밀번호 X

def seq3(current_w, prior_w):  # 3개 연속된 모음/자음 오는 경우 검사
    global prior, current, cnt
    # 현재 문자와 이전 문자가 같은 경우
    if current == prior and current_w == prior_w:
        return seq2(current_w)  # ee, oo인지 확인 
    # 현재와 이전 둘 다 모음/자음이면서, 연속된 문자가 2개인 경우
    elif current == prior and cnt < 2:
        prior = current
        cnt += 1
        return False  # 높은 비밀번호 O
    # 현재와 이전 둘 다 모음/자음이면서, 연속된 문자가 3개인 경우
    elif current == prior and cnt == 2:
        return True  # 높은 비밀번호 X
    # 현재와 이전의 모음/자음 여부가 서로 다른 경우
    else:
        prior = current
        cnt = 1
        return False  # 높은 비밀번호 O

# 입력받은 문자가 "end"가 아닌 동안 순회 
while (word := input().strip()) != "end":
    vowel_appear = False  # 모음 등장 여부 
    acceptance = 1  # 한 번이라도 조건에 부합하지 않는 경우 기록 
    for w in range(len(word)):
        if w == 0:  # 단어의 첫 글자인 경우 
            prior_w = word[w]
            if word[w] in ['a', 'e', 'i', 'o', 'u']:
                vowel_appear = True
                prior = 0
            else:
                prior = 1
            cnt = 1
        else:  # 단어의 첫 글자가 아닌 경우 
            if word[w] in ['a', 'e', 'i', 'o', 'u']:
                vowel_appear = True
                current = 0
            else:
                current = 1
                
            # seq3() 반환값이 True = 낮은 품질의 비밀번호
            if seq3(word[w], prior_w):  
                acceptance *= 0
            prior_w = word[w]
            
    # 모음이 최소한 1번, 모든 경우에서 조건 부합한 경우 
    if vowel_appear and acceptance:  
        print(f"<{word}> is acceptable.")
    else:
        print(f"<{word}> is not acceptable.")

변수 정리

prior: 현재의 문자 바로 앞 문자의 모음/자음 여부 (모음 = 0, 자음 = 1)
prior_w: 현재의 문자 바로 앞 문자
current: 현재의 문자의 모음/자음 여부 (모음 = 0, 자음 = 1)
current_w: 현재의 문자
word: 입력받는 단어
vowel_appear: 모음 등장 여부 (등장O = True, 등장X = False)
acceptance: 한 번이라도 조건 부합하지 않는 경우 등장 = 0, 모든 경우에 조건 만족 = 1
cnt: 연속적으로 모음/자음이 나오는 경우 연속된 문자 개수 저장


한 번이라도 조건에 부합하지 않는 경우가 생긴다면 낮은 품질의 비밀번호이다. 따라서, 비밀번호 품질을 나타내는 변수인 acceptance를 1로 초기화하고 단어를 순회한다. 한 번이라도 조건에 부합하지 않는다면 acceptance에 0을 곱한다. 지금 생각해보니 그냥 0으로 바꿔줘도 되네요..? 코드 짜다가 조금 수정했나보다..

단어의 첫 글자인 경우에는 priorprior_w이 초기화되지 않았으므로 따로 경우를 나눠 설정해준다.



profile
🌱

0개의 댓글