[프로그래머스] 이상한 문자 만들기

유동헌·2021년 9월 13일
0

1일1알고리즘

목록 보기
6/12

링크

https://programmers.co.kr/learn/courses/30/lessons/12930

풀이

def solution(s):
    
    answer = ''
    s_split = s.split(" ")

    
    for str_part in s_split:
        
        for i, c in enumerate(str_part):
            if i % 2 == 0:
                answer += c.upper()
            else:
                answer += c.lower()
        else:
            answer += ' '

    return answer[:-1]
    
print(solution("try hello python"))

코드 설명

answer = ''
 
s_split = s.split(" ")
  • 빈 문자열 answer 선언
  • 테스트케이스의 "try hello python"를 실행하기 위해, 그리고 문자에서 주어진 조건에 만족하려면 단어의 공백을 기준으로 인덱스의 짝수, 홀수가 나뉘어지기 때문에 split 함수로 나눠서 변수를 관리한다
for str_part in s_split:
        
  for i, c in enumerate(str_part):
  • for loop를 두 번 쓰고 해결을 했지만, 다른 방법도 많이 있어보였다. 다른 분들이 푸신 풀이는 뒤쪽에서 살펴보기로 한다.

  • 문자열의 인덱스를 찾기 위해 enumerate 함수를 사용하였다. 위와 같은 코드가 실행이 된다면,

    0 t
    1 r
    2 y
    0 h
    1 e
    2 l
    3 l
    4 o
    0 p
    1 y
    2 t
    3 h
    4 o
    5 n

    이런 식의 결과를 얻을 수 있다. 띄어쓰기는 판별되지 않고, 문제에서 요구하는 값을 이렇게 한 번에 뽑을 수가 있었다.

if i % 2 == 0:
	answer += c.upper()
else:
  answer += c.lower()

인덱스를 기준으로 짝수면 upper, 홀수면 lower 함수를 사용하여 answer에 차곡차곡 쌓는다.

else:
	answer += ' '

return answer[:-1]

만약 짝수도, 홀수도 아니라면 공백을 추가해준다.

여기까지하고 vs code에서 돌려봤을 땐 문제가 없었지만 테스트케이스를 통과하지 못했다. 문제는 가장 뒤에 공백이 하나 더 추가되는 것을 확인할 수 있었다. 그래서 가장 뒤쪽 공백은 제거하면서 리턴한다.

문제를 풀며 참고했었던, 흥미로운 다른 분들의 풀이

https://somjang.tistory.com/entry/Programmers-이상한-문자-만들기-Python

def solution(s):
    
    s_split = s.split(" ")
    
    for k in range(len(s_split)):
        s_list = list(s_split[k])
        
        for i in range(len(s_list)):
            if i % 2 == 0:
                s_list[i] = s_list[i].upper()
            elif i % 2 == 1:
                s_list[i] = s_list[i].lower()
        s_split[k] = "".join(s_list)
        
    answer = " ".join(s_split)
    
    return answer

print(solution("try hello python"))
  • 거의 비슷한 방식으로 푸셨지만, 인덱스를 사용하기 위해 range(len(s_split))를 사용한 부분은 나와 달랐다. 두 번째 for loop의 결과는 0, 1, 2... 이렇게 나올 것이기 때문에 저렇게 비교를 해도 더 깔끔해 보일 수도 있겠다는 생각을 하였다.

    str_list = "try hello python"
    
    s_split = str_list.split(" ")
    
    # print(s_split)
    
    for k in range(len(s_split)):
        s_list = list(s_split[k])
        print(s_list)
    
    # 출력
    # ['t', 'r', 'y']
    # ['h', 'e', 'l', 'l', 'o']
    # ['p', 'y', 't', 'h', 'o', 'n']
  • 또한 몰랐었던 join에 대해 알게 되었다.

    myList = ["John", "Peter", "Vicky"]
    
    x = " ".join(myList)
    
    print(x)
    
    # 출력
    # John Peter Vicky

https://ychae-leah.tistory.com/7

def solution(s):
    
    charlist = ""
    idx = 0
    for i in s:
        if i.isalpha():
            idx += 1
            if idx % 2 != 0:
                charlist += i.upper()
            else:
                charlist += i.lower()
        else:
            idx = 0
            charlist += " "
            continue
        
    return charlist

print(solution("try hello python"))
  • 이 분의 풀이에서도 idx 값을 먼저 설정한 후에 하나씩 더하면서 인덱스를 만드는 아이디어를 얻었다.
  • 두 번째 else 부분에서 인덱스가 isalpha가 아니면 계속 초기화를 시켜주는게 포인트 같다.
profile
지뢰찾기 개발자

0개의 댓글