2019년 5월 7일 화요일

#33 알고리즘연습 - 이상한 문자 만들기 - PYTHON


이상한문자 만들기


문제 설명
문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.
제한 사항
  • 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
  • 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.
입출력 예
sreturn
try hello worldTrY HeLlO WoRlD
입출력 예 설명
try hello world는 세 단어 tryhelloworld로 구성되어 있습니다. 각 단어의 짝수번째 문자를 대문자로, 홀수번째 문자를 소문자로 바꾸면 TrYHeLlOWoRlD입니다. 따라서 TrY HeLlO WoRlD 를 리턴합니다.




문제풀이 IDEA

처음에는 python에서 제공해주는 문자열을 split해서 list로 만든다음 각 단어들이 list의 원소로 들어가 있으니까 그 원소들의 index를 가져와서 하나하나 바꿔주는 생각을 했는데

그렇게 되어버리면 list의 길이만큼 1차로 돌고 다시 각각의 원소에 대해서 for가 돌게되므로
이중 for문이 생성되게 된다.

따라서 그냥 그 string을 탐색하면서 체킹해주는것이 필요한데
원래는 공백을 제외하고 각 index별로 number를 부여해서 number의 짝 홀수 여부에 따라서 다르게 처리해 주려했는데
그러다보니 규칙성 및 이야기가 복잡해지는 것 같아서 flag라는 표식을 만들어서
사용했다.

flag를 가지고 공백을 기준으로 항상 새로 초기화 시켜주고 대문자 소문자로 변환시 flag의 상태를 변환 시켜서 for문 내에서도 두갈래의 길이 번갈아 실행되도록 했다.





나의 코드✨


1
2
3
4
5
6
7
8
9
10
11
12
13
14
def solution(s):
    flag = 0                  #표식을 0으로 초기화
    s = list(s)               #string은 assignment가 되지 않으므로 list로 변환
    for i,v in enumerate(s):  #enumerate를 이용해서 index와 value를 모두 이용할 수 있게
        if v == " ":          #value값이 공백이면 flag를 0으로 선언해준다
                               이때 공백인지 아닌지 판단해서 if를 처리해주는게 중요하므로
                               공백에서 분기되는 if가 제일 상단에 나와야 오류없이 동작한다.
            flag = 0
        elif flag == 0:       # flag 가 0이면 list의 i번째 data를 value를 upper로 만들어서 치환
            s[i] = v.upper()
            flag = 1          # 그리고는 다음 표식은 1로 바꾸어 lower로 처리되도록 한다
        else:                 # flag가 1이면 lower로 만들기 위해 이쪽으로 뺀다
            s[i] = v.lower()
            flag = 0
    return ''.join(s)         #그럼 list의 원소 값들이 모두 원하는 대로 치환되었는데 return값은 다시 string으로 바꾸어 처리



다른 코드

def toWeirdCase(s):
    # 함수를 완성하세요
    return ' '.join([''.join([c.upper() if i % 2 == 0 else c.lower() for i, c in enumerate(w)]) for w in s.split(" ")])

 #위의 코드가 입력받은 문자열을  공백을 기준으로 list로 바꾼다음
for문으로 list의 원소들을 탐색하며
다시 for문으로 원소들의 index를 하나하나 체크해서 index의 홀수 짝수여부에따라서
upper, lower로 처리를 해주고,
이 모든것들을 list comprehension과 조합해서 string의 assignment가 가능하게 해주고
최종적으로 list를 join으로 string으로 바꿔준건데

위의 코드는 특히나 1줄에 너무 많은 내용을 넣으려고 해서
가독성도 떨어지고 한눈에 잘 안들어 오는것 같다(개인적으로)

그래서.. 나는 내 코드가 더 효율적이고 좋은 것 같다.





출처 : 프로그래머스

가장 많이 본 글