본문 바로가기

파이썬(문제풀이)

파이썬 대소문자 바꿔서 출력하기

#1. swapcase() 메서드 사용하기

가장 간단하고 직관적인 방법은 문자열 객체의 내장 메서드인 **swapcase()**를 사용하는 거예요. 이 메서드는 문자열 내의 모든 대문자를 소문자로, 소문자를 대문자로 변환한 새로운 문자열을 반환합니다.

Python
 
# 예제 1: swapcase() 메서드
text = "Hello World! 123"
swapped_text = text.swapcase()
print(swapped_text) # 출력: hELLO wORLD! 123

코드 분석

text = "Hello World! 123" 이 줄은 **"Hello World! 123"**이라는 문자열을 text라는 변수에 할당합니다. 이 문자열에는 대문자, 소문자, 공백, 그리고 숫자가 포함되어 있습니다.

swapped_text = text.swapcase() 이 줄이 핵심적인 부분입니다. swapcase()는 파이썬의 문자열(string) 객체가 제공하는 내장 메서드입니다. 이 메서드는 다음과 같은 기능을 수행합니다:

  • **대문자(Uppercase)**를 **소문자(lowercase)**로 바꿉니다. (예: H -> h)
  • **소문자(Lowercase)**를 **대문자(Uppercase)**로 바꿉니다. (예: e -> E)
  • 알파벳이 아닌 다른 문자들(숫자, 공백, 특수문자 등)은 그대로 둡니다. (예: -> , ! -> !, 1 -> 1)

swapcase() 메서드는 원본 문자열을 직접 수정하지 않고, 새롭게 변환된 문자열을 반환합니다. 따라서 swapped_text 변수에는 원본 문자열의 대소문자가 바뀐 새로운 문자열이 저장됩니다.

print(swapped_text) 마지막으로, 이 줄은 swapped_text 변수에 저장된 문자열의 내용을 출력합니다.


최종 결과

위의 분석을 바탕으로, 이 코드를 실행하면 다음과 같은 출력이 나타납니다:

hELLO wORLD! 123

swapcase() 메서드는 문자열의 대소문자 변환이 필요할 때 가장 간단하고 효율적인 방법입니다.


#2. for 루프와 조건문 사용하기

swapcase() 메서드가 내부적으로 어떻게 동작하는지 이해하려면, **for 루프와 조건문(if, elif)**을 사용해 직접 구현해 볼 수 있어요. 각 문자를 순회하며 대문자인지, 소문자인지 확인하고 변환하는 방식이죠.

# 예제 2: for 루프와 조건문
text = "Hello World! 123"
new_text = ""
for char in text:
    if 'a' <= char <= 'z': # 소문자일 경우
        new_text += char.upper()
    elif 'A' <= char <= 'Z': # 대문자일 경우
        new_text += char.lower()
    else: # 기타 문자일 경우
        new_text += char
print(new_text) # 출력: hELLO wORLD! 123

 

더보기

이 코드는 for 루프와 if-elif-else 조건문을 사용하여 문자열의 각 문자를 순회하며 대소문자를 바꾸는 과정을 보여줍니다. swapcase() 메서드가 내부적으로 어떤 원리로 동작하는지 이해하는 데 도움이 되는 예제입니다.

코드 분석

text = "Hello World! 123" 먼저, "Hello World! 123" 문자열을 text 변수에 할당합니다. 이 문자열이 우리가 처리할 대상입니다.

new_text = "" 대소문자가 바뀐 문자들이 하나씩 추가될 빈 문자열 new_text를 초기화합니다. 이 변수가 최종 결과를 저장하게 됩니다.

for char in text: 이 줄은 text 문자열의 모든 문자를 하나씩 순회하는 for 루프를 시작합니다. 루프가 반복될 때마다 현재 문자가 char 변수에 할당됩니다. 예를 들어, 첫 번째 반복에서는 char가 'H'가 되고, 두 번째 반복에서는 'e'가 되는 식입니다.

if 'a' <= char <= 'z': char가 소문자인지 확인하는 조건문입니다. 파이썬에서는 문자의 아스키(ASCII) 또는 유니코드(Unicode) 값을 기준으로 비교가 이루어집니다. 이 조건이 참이면, 즉 현재 문자가 'a'와 'z' 사이에 있다면:

  • new_text += char.upper(): char를 대문자로 변환한 후(char.upper()), new_text 문자열의 끝에 덧붙입니다.

elif 'A' <= char <= 'Z': 위의 if 조건이 거짓일 때, 이 elif 조건이 실행됩니다. char가 대문자인지 확인합니다. 이 조건이 참이면:

  • new_text += char.lower(): char를 소문자로 변환한 후(char.lower()), new_text에 덧붙입니다.

else: 위의 두 조건(if, elif)이 모두 거짓일 때 이 else 블록이 실행됩니다. 이는 현재 문자가 알파벳이 아닌 경우를 의미합니다(예: 공백, 느낌표, 숫자 등).

  • new_text += char: char를 그대로 new_text에 덧붙입니다.

print(new_text) 루프가 종료되면 모든 문자의 대소문자 변환이 완료되고, 최종 결과가 담긴 new_text 문자열을 출력합니다.


최종 결과

위의 과정을 거쳐 이 코드를 실행하면 다음과 같은 출력이 나옵니다. hELLO wORLD! 123

이 방법은 swapcase() 메서드보다 코드가 길지만, 문자열 처리의 기본적인 논리를 이해하고 직접 구현할 수 있다는 점에서 교육적으로 매우 유용합니다.


#3. 리스트 컴프리헨션 사용하기

파이썬의 리스트 컴프리헨션을 사용하면 위 for 루프를 더 간결하게 표현할 수 있어요. 각 문자를 변환하여 리스트에 담은 후, join() 메서드로 다시 하나의 문자열로 합치는 방식입니다.

# 예제 3: 리스트 컴프리헨션
text = "Hello World! 123"
swapped_list = [char.upper() if 'a' <= char <= 'z' else char.lower() if 'A' <= char <= 'Z' else char for char in text]
swapped_text = "".join(swapped_list)
print(swapped_text) # 출력: hELLO wORLD! 123

 

이 코드는 한 줄로 압축되어 있지만, 읽기 어려울 수 있습니다. 좀 더 가독성을 높이려면 다음과 같이 여러 줄로 나누어 작성할 수도 있어요.

# 예제 4: 더 읽기 쉽게 작성된 리스트 컴프리헨션
text = "Hello World! 123"
swapped_text = "".join([
    char.upper() if char.islower()
    else char.lower() if char.isupper()
    else char
    for char in text
])
print(swapped_text) # 출력: hELLO wORLD! 123

코드 분석

text = "Hello World! 123" 처리할 원본 문자열을 text 변수에 할당합니다.

swapped_text = "".join([...]) 이 줄은 세 부분으로 나눌 수 있습니다: 리스트 컴프리헨션, 삼항 연산자(Ternary operator), 그리고 join() 메서드입니다.

  1. 리스트 컴프리헨션 ([... for char in text]):
    • for char in text: text 문자열의 각 문자를 char에 할당하며 순회합니다. 이 부분은 일반적인 for 루프와 동일하게 동작합니다.
    • [...]: 루프를 돌며 각 char에 대한 연산 결과를 리스트의 요소로 만듭니다.
  2. 삼항 연산자 (char.upper() if char.islower() else ...):
    • char.islower(): char가 소문자인지 확인하는 메서드입니다. True를 반환하면 if 블록이 실행됩니다.
    • char.upper(): char가 소문자일 경우 이 표현식이 실행되어 char를 대문자로 변환합니다.
    • else: char.islower()가 False일 경우 else 블록으로 넘어갑니다.
    • char.lower() if char.isupper(): else 블록 내부에 또 다른 삼항 연산자가 중첩되어 있습니다.
      • char.isupper(): char가 대문자인지 확인하는 메서드입니다.
      • char.lower(): char가 대문자일 경우 소문자로 변환합니다.
    • else char: char가 대문자도 소문자도 아닐 경우(즉, 숫자, 공백, 특수문자 등)에는 char를 그대로 사용합니다.

이 중첩된 삼항 연산자는 각 문자에 대해 대소문자 변환 로직을 한 줄에 담아 표현합니다.

  1. "".join(...):
    • 리스트 컴프리헨션의 결과로 생성된 ['h', 'E', 'L', 'L', 'O', ' ', 'w', 'O', 'R', 'L', 'D', '!', ' ', '1', '2', '3']와 같은 문자의 리스트를 빈 문자열("")을 구분자로 사용하여 하나의 문자열로 합칩니다.
    • 결과적으로 hELLO wORLD! 123이라는 최종 문자열이 만들어져 swapped_text에 저장됩니다.

최종 결과

코드를 실행하면 hELLO wORLD! 123이 출력됩니다. 이 방법은 for 루프를 사용한 예제와 동일한 결과를 내지만, 코드가 더 간결하고 **"함축적"**입니다. 파이썬에서는 이러한 리스트 컴프리헨션과 내장 메서드를 활용하는 것이 성능 면에서도 유리한 경우가 많습니다.


#4. 람다 함수와 map() 사용하기

map() 함수는 시퀀스의 각 요소에 함수를 적용하여 새로운 시퀀스를 반환합니다. 람다(lambda) 함수와 함께 사용하면 각 문자에 대한 대소문자 변환 로직을 간결하게 표현할 수 있습니다.

# 예제 5: 람다 함수와 map()
text = "Hello World! 123"
swapped_text = "".join(map(lambda char: char.upper() if 'a' <= char <= 'z' else char.lower() if 'A' <= char <= 'Z' else char, text))
print(swapped_text) # 출력: hELLO wORLD! 123

코드 분석

text = "Hello World! 123" 이 줄은 우리가 처리할 원본 문자열을 text 변수에 할당합니다.

swapped_text = "".join(...) 이 코드는 크게 map() 함수와 join() 메서드 두 부분으로 나뉩니다.

  1. map(function, iterable): map() 함수는 iterable (여기서는 text 문자열)의 각 요소에 function (여기서는 람다 함수)을 적용한 결과를 map 객체로 반환합니다. 이 객체는 일종의 이터레이터로, 실제 값을 즉시 계산하지 않고 필요할 때마다 값을 생성합니다.
    • lambda char: ...: 이 부분이 바로 람다 함수입니다. 이름 없는(anonymous) 함수로, char라는 하나의 인자를 받아 특정 연산을 수행합니다.
      • char.upper() if 'a' <= char <= 'z'
      • else char.lower() if 'A' <= char <= 'Z'
      • else char 이 삼항 연산자는 for 루프 예제와 동일한 논리를 따릅니다. 문자가 소문자이면 대문자로, 대문자이면 소문자로, 그 외의 문자(숫자, 공백 등)는 그대로 반환합니다.
  2. "".join(...): map() 함수가 반환한 map 객체를 "".join() 메서드가 소비하면서, 각 요소를 연결해 최종적으로 하나의 문자열을 만듭니다. join() 메서드는 반복 가능한 객체(iterable)의 요소들을 지정된 문자열("")로 결합하여 새로운 문자열을 반환합니다.

최종 결과

코드가 실행되면 map()이 text의 각 문자를 변환하고, join()이 그 변환된 문자들을 다시 합쳐 hELLO wORLD! 123이라는 문자열을 완성합니다.

이 방식은 코드가 매우 간결해지지만, 람다 함수 내에 중첩된 삼항 연산자가 있어 초보자에게는 다소 복잡하게 느껴질 수 있습니다. 하지만 함수형 프로그래밍 패러다임을 이해하는 데 좋은 예제가 됩니다.

이 방법은 함수형 프로그래밍 스타일을 선호하는 경우에 유용하며, 코드가 매우 간결해지는 장점이 있습니다.


이 방법들 중 가장 일반적이고 권장되는 방법은 swapcase() 메서드를 사용하는 거예요. 코드가 가장 짧고, 명확하며, 성능도 최적화되어 있기 때문이죠. 나머지 방법들은 파이썬의 다양한 기능들을 학습하거나 특정 상황에서 유연하게 대처할 때 유용하게 활용할 수 있습니다.