https://www.acmicpc.net/problem/4659
4659번: 비밀번호 발음하기
좋은 패스워드를 만드는것은 어려운 일이다. 대부분의 사용자들은 buddy처럼 발음하기 좋고 기억하기 쉬운 패스워드를 원하나, 이런 패스워드들은 보안의 문제가 발생한다. 어떤 사이트들은 xvtp
www.acmicpc.net
def solve(test_case):
#condition1
for i in vowel:
if i in test_case:
break
else:
return False
#condition2
for i in range(len(test_case)-2):
case = test_case[i:i+3]
if condition2(case):
pass
else:
return False
#condition3
for i in range(len(test_case)-1):
case = test_case[i:i+2]
if condition3(case):
pass
else:
return False
return True
def condition2(case):
vowel_count = 0
cons_count = 0
for i in case:
if i in vowel:
vowel_count += 1
if i in cons:
cons_count += 1
if vowel_count == len(case) or cons_count == len(case):
return False
return True
def condition3(case):
if case == 'ee' or case == 'oo':
return True
if case[0] == case[1]:
return False
return True
def acceptable(word, flag):
if flag:
return f"<{word}> is acceptable."
else:
return f"<{word}> is not acceptable."
alphabet = [chr(c) for c in range(ord('a'), ord('z')+1)]
vowel = ['a','e','i','o','u']
cons = list(set(alphabet) - set(vowel))
while True:
test_case = input()
if len(test_case) == 1:
if test_case in vowel:
print(acceptable(test_case, True))
continue
else:
print(acceptable(test_case, False))
continue
if test_case == 'end':
break
flag = solve(test_case)
print(acceptable(test_case, flag))
solve()
먼저 solve()
는 조건(condition
) 1, 2, 3을 차례로 확인하면서 조건에 부합하지 않으면 False
를 반환하고 모든 조건을 통과하면 True
를 반환하는 함수입니다.
condition1
- 조건 1 : 모음(a,e,i,o,u) 하나를 반드시 포함하여야 한다.
먼저 조건 1에 해당하는 알고리즘입니다.
for i in vowel:
if i in test_case:
break
else:
return False
각 모음이 담겨있는 vowel
리스트를 확인하면서 test_case
에 모음이 들어있다면 반복문을 break
로 탈출합니다.
- 이때
break
문으로 탈출하지 못하면else
로 인하여False
를 반환합니다.
condition2()
- 조건 2 : 모음이 3개 혹은 자음이 3개 연속으로 오면 안 된다.
먼저 반복문을 통하여 test_case
의 연속된 3개의 문자 case
를 추출합니다.
다음 아래의 condition2()함수를 호출합니다.
def condition2(case):
vowel_count = 0
cons_count = 0
for i in case:
if i in vowel:
vowel_count += 1
if i in cons:
cons_count += 1
if vowel_count == len(case) or cons_count == len(case):
return False
return True
코드는 연속된 3개의 문자 case
의 각 문자들을 확인하면서 case
가 모음이 3개인지, 자음이 3개인지 판별합니다.
이때 모음 혹은 자음이 3개라면 False
를 반환하고 아니라면 True
를 반환합니다.
condition3()
- 조건 3 : 같은 글자가 연속적으로 두번 오면 안되나, ee 와 oo는 허용한다.
condtion3 또한 먼저 반복문을 통하여 test_case
의 연속된 2개의 문자 case
를 추출합니다.
def condition3(case):
if case == 'ee' or case == 'oo':
return True
if case[0] == case[1]:
return False
return True
case
가 ee
혹은 oo
라면 True
를 반환합니다.
그리고 두개의 문자가 동일하면 False
를 반환하고 아니라면 True
를 반환합니다.
while
마지막으로 while문을 확인하겠습니다.
먼저 아래의 두 리스트를 초기화합니다.
- vowel : 모음을 모아놓은 리스트
- cons : 자음을 모아놓은 리스트
test_case
의 문자의 길이가 1인 경우에 해당 문자가 모음이라면 is acceptable.
아니라면 is not acceptable.
을 출력하고 다음 test_case
로 넘어갑니다.
그 다음 flag
를 통하여 위의 조건들을 부합하였는지 판단하고
부합하였다면 is acceptable.
을 출력하고, 부합하지 않았다면 is not acceptable.
출력합니다.
'코딩테스트' 카테고리의 다른 글
[코딩테스트] 프로그래머스 정수 삼각형 파이썬(Python) (0) | 2023.03.02 |
---|---|
[코딩테스트] 백준 영단어 암기는 괴로워 파이썬(Python) (0) | 2023.02.28 |
[코딩테스트] 프로그래머스 대충 만든 자판 파이썬(Python) (0) | 2023.02.27 |
[코딩테스트] 백준 안전 영역 파이썬(Python) (0) | 2023.02.25 |
[코딩테스트] 프로그래머스 가장 먼 노드 파이썬(Python) (0) | 2023.02.23 |