이 글에서는 주어진 문제를 해결하기 위한 접근 방식과 풀이 과정을 단계별로 살펴보겠습니다.
문제 정의
문자열이 입력으로 주어졌을 때, 해당 문자열에 포함된 대문자와 소문자의 개수를 각각 구해야 합니다.
흔히 사용하는 isupper()나 islower() 같은 내장 문자열 메서드 대신, ord() 함수를 활용해 각 문자의 ASCII 값을 직접 확인하는 방식으로 문제를 해결합니다.
먼저 대문자 카운터와 소문자 카운터 두 개를 0으로 초기화합니다. 이후 입력 문자열을 한 문자씩 순회하면서 각 문자의 ASCII 값을 검사하고, 조건에 맞으면 해당 카운터를 1씩 증가시킵니다.
참고로 소문자 'a'~'z'는 ASCII 코드 97~122에 해당하고, 대문자 'A'~'Z'는 65~90에 해당합니다.
구현 예제
def upperlower(string):
upper = 0
lower = 0
for i in range(len(string)):
# 소문자 판별 (ASCII 97~122)
if (ord(string[i]) >= 97 and
ord(string[i]) <= 122):
lower += 1
# 대문자 판별 (ASCII 65~90)
elif (ord(string[i]) >= 65 and
ord(string[i]) <= 90):
upper += 1
print('Lower case characters = %s' %lower,
'Upper case characters = %s' %upper)
# 실행 코드
string = 'Tutorialspoint'
upperlower(string)실행 결과
Lower case characters = 13 Upper case characters = 1
'Tutorialspoint'라는 문자열에는 소문자가 13개, 대문자(T)가 1개 포함되어 있으므로 위와 같은 결과가 출력됩니다.
아래 그림과 같이 모든 변수와 함수는 전역 범위(global scope)에서 선언되어 프로그램 내 어디에서든 접근할 수 있습니다.

결론
이 글에서는 isupper(), islower() 같은 내장 메서드를 사용하지 않고 ord() 함수로 ASCII 값을 확인하여 문자열 내 대문자와 소문자의 개수를 세는 방법을 알아보았습니다. 이러한 접근 방식은 문자의 내부 표현 원리를 이해하는 데에도 큰 도움이 됩니다.