좋은 패스워드를 만드는것은 어려운 일이다. 대부분의 사용자들은 buddy처럼 발음하기 좋고 기억하기 쉬운 패스워드를 원하나, 이런 패스워드들은 보안의 문제가 발생한다. 어떤 사이트들은 xvtpzyo 같은 비밀번호를 무작위로 부여해 주기도 하지만, 사용자들은 이를 외우는데 어려움을 느끼고 심지어는 포스트잇에 적어 컴퓨터에 붙여놓는다. 가장 이상적인 해결법은 '발음이 가능한' 패스워드를 만드는 것으로 적당히 외우기 쉬우면서도 안전하게 계정을 지킬 수 있다.
회사 FnordCom은 그런 패스워드 생성기를 만들려고 계획중이다. 당신은 그 회사 품질 관리 부서의 직원으로 생성기를 테스트해보고 생성되는 패스워드의 품질을 평가하여야 한다. 높은 품질을 가진 비밀번호의 조건은 다음과 같다.
- 모음(a,e,i,o,u) 하나를 반드시 포함하여야 한다.
- 모음이 3개 혹은 자음이 3개 연속으로 오면 안 된다.
- 같은 글자가 연속적으로 두번 오면 안되나, ee 와 oo는 허용한다.
이 규칙은 완벽하지 않다;우리에게 친숙하거나 발음이 쉬운 단어 중에서도 품질이 낮게 평가되는 경우가 많이 있다.
입력
입력은 여러개의 테스트 케이스로 이루어져 있다.
각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 테스트할 패스워드가 주어진다.
마지막 테스트 케이스는 end이며, 패스워드는 한글자 이상 20글자 이하의 문자열이다. 또한 패스워드는 대문자를 포함하지 않는다.
출력
각 테스트 케이스를 '예제 출력'의 형태에 기반하여 품질을 평가하여라.
예제 입력 1 복사
a
tv
ptoui
bontres
zoggax
wiinq
eep
houctuh
end
예제 출력 1 복사
<a> is acceptable.
<tv> is not acceptable.
<ptoui> is not acceptable.
<bontres> is not acceptable.
<zoggax> is not acceptable.
<wiinq> is not acceptable.
<eep> is acceptable.
<houctuh> is acceptable.
그냥 조건 하나씩 체크해주는 배열을 만들었다.
구현에는 방도가없다...
import sys
sys.stdin = open("2_3_20220810_백준_4659_비밀번호발음하기.txt", "r")
def checkEssential(word) :
flag = False
for w in word :
if w == 'a' or w == 'e' or w == 'i' or w == 'o' or w =='u' :
flag = True
return flag
#모음이 3개, 자음이 3개연속으로 오면 안된다.
def checkRecurWord(word) :
vowel = 0 #모음
consonant = 0 #자음
for w in word :
if w == 'a' or w == 'e' or w == 'i' or w == 'o' or w =='u' :
consonant = 0 #자음 초기화
vowel += 1 #모음 카운트 +1
else :
vowel = 0
consonant += 1
if vowel >= 3 or consonant >= 3:
return False
return True
#같은 글자가 연속적으로 두번 오면 안되나, ee 와 oo는 허용한다.
def checkSameWord(word) :
stack = []
wordList = list(word)
stack.append(wordList[0]) #0번째꺼 넣기
for i in range(1, len(word)) : #1번째부터 끝까지 비교
if stack[-1] != wordList[i] or (stack[-1] == 'e' and wordList[i] == 'e' ) or (stack[-1] == 'o' and wordList[i] == 'o' ) : #꼭대기랑 현재꺼랑 비교해서 다른 경우
stack.pop() #기존에 있던거 pop
stack.append(wordList[i]) #새로운거 다시 스택에 넣기
#스택에 있는 꼭대기랑, 현재 비교한 값이랑 같은 경우 False
else :
return False
return True
while True :
word = input()
if word == "end" :
break
#1. 모음(a,e,i,o,u) 하나를 반드시 포함
if checkEssential(word) :
if checkRecurWord(word) :
if checkSameWord(word) :
print(f'<{word}> is acceptable.')
else :
print(f'<{word}> is not acceptable.')
else :
print(f'<{word}> is not acceptable.')
else :
print(f'<{word}> is not acceptable.')
#모음(a,e,i,o,u) 하나를 반드시 포함
#모음이 3개 혹은 자음이 3개 연속으로 오면 안 된다.
#같은 글자가 연속적으로 두번 오면 안되나
#ee 와 oo는 허용한다.
# a
# tv
# ptoui
# bontres
# zoggax
# wiinq
# eep
# houctuh
# end
#영어 자음
#['b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','y','z']
스택에 넣지 않고, prev 인덱스를 이용해서 앞꺼랑 같은지 체크할수있다.
import sys
sys.stdin = open("2_3_20220810_백준_4659_비밀번호발음하기.txt", "r")
def checkEssential(word) :
flag = False
for w in word :
if w == 'a' or w == 'e' or w == 'i' or w == 'o' or w =='u' :
flag = True
return flag
#모음이 3개, 자음이 3개연속으로 오면 안된다.
def checkRecurWord(word) :
vowel = 0 #모음
consonant = 0 #자음
for w in word :
if w == 'a' or w == 'e' or w == 'i' or w == 'o' or w =='u' :
consonant = 0 #자음 초기화
vowel += 1 #모음 카운트 +1
else :
vowel = 0
consonant += 1
if vowel >= 3 or consonant >= 3:
return False
return True
#같은 글자가 연속적으로 두번 오면 안되나, ee 와 oo는 허용한다.
#prev를 이용해서 앞것을 가리키자
def checkSameWord(word) :
prev = 0
wordList = list(word)
for i in range(1, len(word)) :
if word[prev] != wordList[i] or (word[prev] == 'e' and wordList[i] == 'e' ) or (word[prev] == 'o' and wordList[i] == 'o' ) :
prev += 1
else :
return False
return True
# for i in range(1, len(word)) : #1번째부터 끝까지 비교
# if stack[-1] != wordList[i] or (stack[-1] == 'e' and wordList[i] == 'e' ) or (stack[-1] == 'o' and wordList[i] == 'o' ) : #꼭대기랑 현재꺼랑 비교해서 다른 경우
# #스택에 있는 꼭대기랑, 현재 비교한 값이랑 같은 경우 False
# else :
# return False
# return True
while True :
word = input()
if word == "end" :
break
#1. 모음(a,e,i,o,u) 하나를 반드시 포함
if checkEssential(word) :
if checkRecurWord(word) :
if checkSameWord(word) :
print(f'<{word}> is acceptable.')
else :
print(f'<{word}> is not acceptable.')
else :
print(f'<{word}> is not acceptable.')
else :
print(f'<{word}> is not acceptable.')
'코테풀이 > 구현' 카테고리의 다른 글
[백준 | 실버2] 19583 : 싸이버개강총회(구현) (0) | 2022.08.17 |
---|---|
[백준 | 실버3] 3474번 : 교수가된현우(수학) (0) | 2022.08.11 |
[백준 | 실버5] 10709번 : 기상캐스터(구현, 시뮬레이션) (0) | 2022.08.10 |
[백준 | 실버5] 2828 : 사과 담기 게임(매우 복습 필요) (0) | 2022.08.10 |
[백준 | 실버3] 패션왕 신해빈(조합, 조합 공식, 조합 개수만) (0) | 2022.08.03 |
[백준 | 실버5] 4659번 : 비밀번호 발음하기(구현, 시뮬레이션)