문제 개요
영문 알파벳(대문자 또는 소문자)만 포함된 문자열 s가 주어졌을 때, 소문자들과 대문자들이 각각 동일한 순서를 따르는지 확인해야 합니다. 즉, 어떤 문자가 소문자로 여러 번 등장한다면, 같은 문자의 대문자도 동일한 횟수와 순서로 나타나야 합니다.
예를 들어 입력이 s = "piPpIePE"라면 결과는 True입니다. 소문자 "pie"와 대문자 "PIE"가 각각 추출되며, 두 문자열은 대소문자만 다를 뿐 문자 구성과 등장 순서가 완전히 일치하기 때문입니다.
해결 접근 방식
이 문제는 다음 단계를 통해 해결할 수 있습니다.
- 빈 문자열
lowercase와uppercase를 초기화합니다. - 문자열
s를 처음부터 끝까지 순회하면서 각 문자를 검사합니다. - 현재 문자가 대문자라면
uppercase에 이어 붙이고, 그렇지 않으면lowercase에 이어 붙입니다. - 순회가 끝나면
lowercase를 모두 대문자로 변환합니다. - 변환된 문자열과
uppercase가 같다면True, 다르다면False를 반환합니다.
핵심 아이디어는 간단합니다. 원본 문자열에서 소문자만 순서대로 모은 뒤 대문자로 변환했을 때, 대문자만 순서대로 모은 문자열과 정확히 같다면 두 그룹의 순서가 일치한다고 판단할 수 있습니다.
Python 구현 예제
def solve(s):
lowercase = ""
uppercase = ""
for i in range(len(s)):
if ord(s[i]) >= 65 and ord(s[i]) <= 91:
uppercase += s[i]
else:
lowercase += s[i]
to_upper = lowercase.upper()
return to_upper == uppercase
s = "piPpIePE"
print(solve(s))입력
"piPpIePE"
출력
True
코드 설명
위 코드에서는 ord() 함수를 사용해 각 문자의 아스키(ASCII) 코드 값을 확인합니다. 영어 대문자 'A'~'Z'의 아스키 코드 범위는 65~90이므로, 해당 범위에 속하면 대문자로 분류하여 uppercase에 추가하고, 그 외의 경우에는 lowercase에 추가합니다.
모든 문자를 분류한 후 lowercase.upper()로 소문자 문자열을 대문자로 변환하고, 이것이 uppercase와 동일한지 비교합니다. 두 문자열이 같으면 대문자와 소문자가 같은 순서로 배치되어 있다는 의미이므로 True가 반환됩니다.
개선된 구현 (isupper 활용)
아스키 코드 대신 파이썬의 내장 메서드 isupper()를 사용하면 코드를 더욱 직관적으로 작성할 수 있습니다.
def solve(s):
lowercase = "".join(c for c in s if c.islower())
uppercase = "".join(c for c in s if c.isupper())
return lowercase.upper() == uppercase이 버전은 리스트 컴프리헨션 스타일의 제너레이터 표현식과 join()을 활용해 가독성을 높였으며, 실행 결과는 동일하게 True를 출력합니다. 시간 복잡도는 두 구현 모두 O(n)으로, 문자열 길이에 비례하여 선형적으로 처리됩니다.