문제 개요
문자열 s가 주어졌을 때, 이 문자열에 포함된 모음(vowel)들이 알파벳 순서대로 배치되어 있는지 확인해야 합니다.
예를 들어 입력이 s = "helloyou"라고 가정해 보겠습니다. 이 문자열의 모음은 e, o, o, u이며, 모두 알파벳 순서를 따르고 있으므로 결과는 True가 됩니다.
해결 접근 방법
이 문제는 다음 단계를 거쳐 해결할 수 있습니다.
- 기준 문자(character)를 ASCII 코드 64에 해당하는 문자(chr(64), 즉 '@')로 초기화합니다. 이 값은 모든 영문 알파벳보다 작으므로 비교의 시작점으로 적합합니다.
- 문자열의 처음부터 끝까지 한 글자씩 반복하며 검사합니다.
- 현재 문자가 모음(A, E, I, O, U 또는 소문자 a, e, i, o, u)에 해당하는지 확인합니다.
- 모음이라면, 현재 문자가 이전에 저장한 기준 문자보다 작은지(즉, 알파벳 순서가 역전되었는지) 검사합니다. 작다면 순서가 깨진 것이므로 False를 반환합니다.
- 순서가 유지되고 있다면 기준 문자를 현재 모음으로 갱신하여 다음 비교에 사용합니다.
- 끝까지 모든 검사를 통과하면 True를 반환합니다.
이 알고리즘은 문자열을 한 번만 순회하므로 시간 복잡도는 O(n)입니다. 여기서 n은 문자열의 길이입니다.
예제 코드
def solve(s):
character = chr(64)
for i in range(len(s)):
if s[i] in ['A','E','I','O','U','a','e','i','o','u']:
if s[i] < character:
return False
else:
character = s[i]
return True
s = "helloyou"
print(solve(s))
입력
"helloyou"
출력
True
코드 설명
chr(64)는 ASCII 코드 64번 문자인 '@'를 반환합니다. 알파벳 대문자 'A'는 ASCII 코드 65이므로, 초기 기준값을 64로 설정하면 어떤 모음과 비교하더라도 항상 "순서가 유지되는 것"으로 판단되어 첫 번째 모음을 문제없이 통과할 수 있습니다.
이후 문자열을 순회하면서 모음을 만날 때마다 직전 모음과 크기를 비교하고, 더 작은 모음이 등장하는 순간 즉시 False를 반환함으로써 효율적으로 순서 여부를 판별합니다. 대소문자를 모두 처리하기 위해 비교 목록에 대문자와 소문자 모음을 함께 포함시킨 점도 눈여겨볼 만합니다.