프로그래머스 파이썬 기초 해석 :: 대소문자 바꿔서 출력하기(모듈, 한줄 for문)

 

프로그래머스 URL

https://school.programmers.co.kr/learn/courses/30/lessons/181949



프로그래머스 코딩 카테고리 

코딩 기초 트레이닝

Day 1 출력

Lv.0





문제 설명

영어 알파벳으로 이루어진 문자열 str이 주어집니다. 각 알파벳을 대문자는 소문자로 소문자는 대문자로 변환해서 출력하는 코드를 작성해 보세요.





문제 이해

문자열의 대소문자와 관련된 메서드를 아는지 묻는 문제 

대문자 식별 메서드 : 문자열.isupper()
소문자 식별 메서드 : 문자열.islower()

대문자로 바꾸는 메서드 : 문자열.upper()
소문자로 바꾸는 메서드 : 문자열.lower()

소문자는 대문자로, 대문자는 소문자로 바꾸는 메서드 : 문자열.swapcase()




문제 풀이

1) 문자열를 하나하나 체크해서, 대문자 / 소문자 변환한걸 바로 출력하는 경우

 
str = input()
for i in str :
    if i.isupper():
        print(i.lower(), end='')
    else: 
        print(i.upper(), end='')         
print 함수는 기본적으로 출력 후 자동으로 줄바꿈을 하지만, 줄바꿈 없이 출력하고 싶다면 다음과 같이 end 매개변수를 사용하면 된다. 
print 함수의 end 매개변수 기본값은 줄바꿈(\n) 인데, end=',' 이 처럼 문자열 출력의 끝자리를 바꿀 수 있다



2) 문자열를 하나하나 체크해서, 비어있는 문자열에 넣는 경우

     
str = input()
new = ''
for i in str :
    if i.isupper():
        new += i.lower()
    else: 
        new += i.upper()
    
print(new)     
연습을 하면서 내가 한 어리석은 실수는 습관적으로 return new를 썼다는 것이다. 에러가 발생했고, 함수 밖에서 return 을 사용했다는 것이었다. 이 코드에서는 함수를 쓰지않고, for문으로만 하기 때문에 return값을 쓸 수 없다. (함수를 쓸때 return값을 쓸 수 있다. ) 따라서, 문자열은 print문으로 출력을 해야한다. 



3) for 문과 if문을 한 줄에 쓰는 경우 

고수의 풀이를 보고 경이로웠다.. 
한줄 if문을 넘어서, for문에 문자열 병합을 한 줄로 적으셨다. 


  
print(''.join(x.upper() if x == x.islower() else x.lower() for x in input()))   
#x==x.lower() 대신 ('==')을 제외한 x.islower() 을 써도됨        
리스트 컨프리헨션(List Comprehension)을 사용해서 반복문과 조건문을 중첩해 리스트를 생성하는 방법이다. 


① 한 줄 for문 = 리스트 컨프리헨션

list = [표현식 for 요소 in 범위]  #네모 괄호로 만들면, 리스트로 만들어진다. 
for문의 뒷 부분에 있는 "범위"로 어디부터 어디까지를 반복할 건지 정함. 
그리고 for문의 앞 부분에 있는 "표현식"에서 조건을 만들어 성립하는 값만 저장하도록 하는것

gene = (표현식 for 요소 in 범위)  #둥근 괄호로 만들면, 제너레이터 표현식으로 만들어진다. 

※ 둥근 괄호라고 해서, 튜플이라고 생각하면 안됨. 제너레이터 표현식은 변수로 별도 저장되서 메모리를 쓰는게 아니라, 잠깐 만들어져서 일회성으로 사용하는 것임. 

따라서, 제너레이터 표현식으로 만들어진 numbers 변수를 출력하면 이렇게 나옴 


* 한줄 for문 예시
num = [x for x in range(5) ] 
(출력) num = [0, 1, 2, 3, 4]  
(참고) range(start=0, end, step=1) 함수  
range 함수의 첫번째 매개변수인 start의 기본값은 0이고 생략 가능하다. 세번째 매개변수인 step은 기본값이 1로, 생략 가능하다. range(5)는 0부터 4(5-1)까지 1단위로 출력함을 의미한다.

※ for문을 쓸때, in 뒤에는 반복 가능한 "범위" 가 와야한다. 단순 숫자만 넣으면, 오류가 나기때문에, 파이썬에서 for x in 5 는 틀린 문법. 0부터 5까지를 가지는 range(5) 함수를 써야한다. 

list = [x for x in num if x % 2 == 0 ] 
num 변수안에 있는 것 중에서 짝수인 값만 저장함을 의미


list = [x.upper() if x.islower() else x.lower() for x in str ]

표현식에 한줄 if문이 들어온 경우이다. 이거랑 join 함수를 활용해서 한줄로 코드를 작성하면 아래와 같은 코드가 된다.

print(''.join(x.upper() if x == x.lower() else x.lower() for x in input()))           

 

② 한 줄 if문 

result = A if 조건1 else B 
result = A if 조건1 else B if 조건2 else C




4) 치트키로 내장함수를 쓴 경우

swapcase() 함수는 문자열 내장 메서드로, 대문자를 소문자로, 소문자를 대문자로 바꾸는 역할을 한다. 
print(input().swapcase())         





추가

join 메서드 

구분자.join(반복 가능한 객체) 은 괄호 안에 오는 각 요소를 구분자로 연결해 하나의 문자열로 반환한다. 

my_list = ['Hello', 'world', 'I', 'am', 'here']
result = ' '.join(my_list)
print(result)


------------------------


 

느낀점

문자열의 유연성은 정말 무궁무진하구나,, 

알아가는게 재밌긴한데 어렵기도 하다.. 







댓글

이 블로그의 인기 게시물

[KT 에이블스쿨 - IT 트랜드] 국내외 AI 관련 규제

KT 에이블스쿨 : 핀테크 아이디어 공모전

KT 에이블스쿨 : 6-7차 미니프로젝트 - 제안서 기반 솔류션 기획 및 설계