파이썬에는 문자열을 손쉽게 다룰 수 있는 다양한 메서드가 마련되어 있습니다. 그렇다면 코딩 테스트에서 "문자열의 첫 글자를 대문자로 변환하라"는 요구를 받으면 어떻게 해결해야 할까요? 이 글에서는 이러한 목표를 달성하기 위해 문자열을 조작하는 한 가지 방법을 소개합니다.
문제 정의
주어진 파이썬 문자열에서 첫 글자를 대문자로 변환해 반환하는 함수를 작성하세요.
명확하게 질문하기
이런 유형의 문제는 취업 면접에서 자주 출제됩니다. 면접 상황이라면 문제를 정확히 이해했는지 확인하기 위해 면접관에게 질문하는 것이 좋습니다.
문제에 접근하기 전에 생각해 볼 만한 질문들은 다음과 같습니다.
- 질문: 문자열이 항상 존재한다고 보장할 수 있나요? null이나 빈 문자열을 처리할 일은 없나요?
- 답변: 문자열이 항상 존재하는 것은 아닙니다. 하지만 이런 엣지 케이스를 꼼꼼히 살피는 것은 아주 좋은 습관입니다!
- 질문: "첫 글자"란 문자열 전체의 첫 글자를 말씀하시는 건가요, 아니면 문자열 안 각 단어의 첫 글자를 말씀하시는 건가요?
- 답변: 문자열 전체의 첫 글자를 의미합니다.
- 질문: 첫 번째 문자가 항상 알파벳이라고 보장할 수 있나요? 첫 문자가 숫자인 경우도 처리해야 하나요?
- 답변: 좋은 지적입니다! 첫 글자가 반드시 문자열의 첫 문자인 것은 아닙니다. 문자열에서 처음으로 등장하는 알파벳을 찾아 대문자로 변환해 주세요.
접근 방법
이 문제를 풀어 나가는 방법은 여러 가지가 있으며, 정답 역시 하나로 정해져 있지 않습니다. 다른 방식을 떠올렸다면 그것 또한 훌륭한 해법입니다!
엣지 케이스를 먼저 처리하자
먼저 문자열이 None이거나 빈 문자열이거나, 첫 문자가 알파벳이 아닌 경우를 처리해야 합니다. 코드로 살펴보겠습니다.
def capitalize_str(str):
if str == None: # str이 None인 경우
return "NoneType is not a string"
elif len(str) > 0: # str이 존재하는 경우
# 첫 문자가 숫자라면 다음 문자로 이동하고, 알파벳이라면 대문자로 변환
return str # 임시 코드 -- 다음 단계에서 완성할 예정
else: # str이 빈 문자열인 경우
return "undefined string"
capitalize_str("hello")
위 코드에서는 문자열이 None이거나 길이가 0인 엣지 케이스를 처리했습니다. 아직 대문자로 변환된 문자열을 반환하는 실제 로직은 구현하지 않았습니다. 무엇보다 문자열이 존재하는지 먼저 확인해야 하기 때문입니다.
이제 문자열의 첫 문자가 알파벳인지 확인하는 방법을 살펴보겠습니다. 첫 문자가 숫자나 특수문자라면 알파벳을 찾을 때까지 다음 문자로 이동하고, 알파벳을 만나면 대문자로 변환한 뒤 결과 문자열을 반환합니다. 만약 문자열 끝까지 알파벳이 없다면 그 사실을 알려주면 됩니다.
def capitalize_str(str):
if str == None: # str이 None인 경우
return "NoneType is not a string"
elif len(str) > 0: # str이 존재하는 경우
i = 0
while i < len(str):
if str[i].isalpha(): # 현재 문자가 알파벳인지 확인
return str[0:i] + str[i].upper() + str[i + 1:]
else:
i += 1
return "string does not have letters"
else: # str이 빈 문자열인 경우
return "undefined string"
print(capitalize_str("christina"))
파이썬의 문자열 메서드 중 하나인 isalpha()는 해당 문자가 알파벳인지 검사합니다. 알파벳이 아니라면 다음 문자로 넘어가고, 첫 번째 알파벳 문자를 만나면 "문자열의 앞부분 + 대문자로 변환한 글자 + 나머지 문자열"을 연결해 반환합니다.
참고로 파이썬에는 첫 문자를 대문자로 변환해 주는 capitalize() 함수도 있습니다. 하지만 이 함수는 첫 문자가 알파벳이 아닌 엣지 케이스는 처리하지 못합니다. 그래서 위 예제에서는 while 루프로 문자를 하나씩 검사하다가, 첫 알파벳을 발견하는 순간 의도적으로 루프를 빠져나오는 방식을 사용했습니다.
마무리
지금까지 소개한 것은 이 코딩 문제를 해결하는 여러 방법 중 하나일 뿐입니다. 물론 여기서 다룬 방법만큼 좋은(혹은 더 나은) 다른 풀이도 얼마든지 있을 수 있습니다. 진짜 중요한 것은 문제 설명이 불분명할 때 질문을 던지고, 엣지 케이스를 미리 고려하는 습관입니다. 이 두 가지만 익히면 코딩 테스트를 거의 문제없이 통과할 수 있을 것입니다. 좋은 결과를 기원합니다!