- 문제 : https://www.acmicpc.net/problem/4659
문제 이해
- 주어지는 각 단어마다 성공적인 비밀번호를 작성하는 방법에 맞는 경우는 acceptable, 맞지 않는 경우는 not acceptable을 출력하는 문제다.
- 생각보다 비밀번호 작성 조건이 많아서 그거를 맞추는 코드를 작성하는데 시간이 좀 들었던 문제다.
- 각 비밀번호 조건은 다음과 같다.
1. 모음(a, e, i, o, u)이 하나 이상 포함되어 있을 것
2. 3개 이상의 자음 또는 모음이 연속적으로 있으면 안됨 (abc, oui 등)
3. 같은 문자 2개 이상이 연속되면 안됨. 단, ee, oo는 가능함
- 정규 표현식 같은 걸로 간편하게 할 수 없을까 찾아봤는데 딱 맞는 거는 없었다. 결국 노가다로 일일히 하나씩 체크하는 방식으로 하니 정답이 떴던 문제다.
풀이 로직
- 각 비밀번호 조건에 맞는 로직을 작성해야하는데, 각 조건마다 일반 탐색으로 풀었다.
1. 모음(a, e, i, o, u)이 하나 이상 포함되어 있을 것 -> vowels 배열을 만들어 vowles의 원소 중 몇 개가 단어에 포함되어있는지 count로 확인한다. 만약 count == 0 이라면 모음이 없는 것이므로 실패 처리한다.
2. 같은 문자 2개 이상이 연속되면 안됨.
-> 모음의 경우 : 모음을 탐색하면서 같은 모음 2개를 붙인 단어가 입력된 단어(word)에 있다면, 또 그 문자가 e 또는 o가 아니라면 실패 처리(flag = False)
-> 자음의 경우 : 자음을 탐색하면서 같은 자음 2개를 분인 뒤 입력된 단어(word)에 있는지 확인하고, 있다면 실패 처리한다.
3. 같은 종류의 문자가 연속으로 3개 있는 경우는 주어진 단어(word)를 세 개씩 순차적으로 탐색한 다음 그 세 개의 문자가 모두 같은 vowels 또는 consonant에 포함된다면 실패한 경우이므로 flag = False를 한 뒤 반복문을 break 한다.
- 위 과정에서 걸렸다면 실패 케이스이므로 바로 문장을 출력하면 되지만, 만약 위의 경우에 하나도 안 걸렸다면 성공 케이스이므로 성공 문장을 출력한다.
정답 풀이
vowels = ['a', 'e', 'i', 'o', 'u']
consonant = ['b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z']
while True:
word = input()
if word == 'end':
break
arr = list(word)
count = 0
flag = True
# 모음 없는 경우와 oo/ee 가 아닌 모음이 두 개 연속되는 단어 있는지 확인
for vowel in vowels:
if vowel in arr:
count += 1
two = vowel + vowel
if two in word:
if two != 'oo' and two != 'ee':
flag = False
if count == 0 or not flag:
print('<' + word + '>' + ' is not acceptable.')
continue
# 같은 자음 연속으로 두 개 있는지 확인
for each in consonant:
if each + each in word:
flag = False
print('<' + word + '>' + ' is not acceptable.')
break
# 연속된 세 알파벳이 모두 자음에 포함되거나 모두 모음에 포함되는 경우 있는지 확인
for i in range(0, len(arr) - 2):
first, second, third = arr[i], arr[i + 1], arr[i + 2]
if first in vowels and second in vowels and third in vowels:
flag = False
print('<' + word + '>' + ' is not acceptable.')
break
if first in consonant and second in consonant and third in consonant:
flag = False
print('<' + word + '>' + ' is not acceptable.')
break
if flag :
print('<' + word + '>' + ' is acceptable.')
'백준 > String' 카테고리의 다른 글
[문자열/백준] 2179번 : 비슷한 단어 (0) | 2023.06.16 |
---|---|
[문자열/백준] 20437번 : 문자열 게임2 (0) | 2023.06.16 |
[문자열/백준] 9996번 : 한국이 그리울 땐 서버에 접속하지 (0) | 2023.06.15 |
[문자열/백준] 22233번 : 가희와 키워드 (0) | 2023.06.14 |
[문자열/백준] 1213번 : 팰린드롬 만들기 (0) | 2023.06.14 |