
백준 문제집 PS
ses0028님의 "IT기업 및 대기업 계열사 코테보면서 비슷했던 문제들(지속적으로 업데이트 중)"
이번 방학 2달동안 골드 3 (81문제)까지 다 푸는 것이 목표입니다.
25.01.10 - 실버 5 1문제
⛳ (14/81문제)
문제 문제 제목 문제 티어 문제 링크 풀이 링크 4659 비밀번호 발음하기 실버 5 https://www.acmicpc.net/problem/4659 🔗

40분
실버 5


높은 품질의 비밀번호 조건
- 모음(a,e,i,o,u) 하나를 반드시 포함하여야 한다.
- 모음이 3개 혹은 자음이 3개 연속으로 오면 안 된다.
- 같은 글자가 연속적으로 두번 오면 안되나, ee 와 oo는 허용한다.
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으로 바꿔줘도 되네요..? 코드 짜다가 조금 수정했나보다..
단어의 첫 글자인 경우에는 prior과 prior_w이 초기화되지 않았으므로 따로 경우를 나눠 설정해준다.