NIRVANA

[level 1] 이상한 문자 만들기 본문

Coding test(Python3)/Programmers

[level 1] 이상한 문자 만들기

녜잉 2023. 7. 18. 15:03

문제

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.제한 사항

  • 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
  • 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.

 

문제 접근법1

1) 문자열 s를 리스트로 변경 후, 리스트의 길이 만큼 반복문을 진행

2) 첨자 j=0를 따로 사용하여 문장을 단어로 나눔

3) 만약 j가 짝수이거나 0이면 문자를 대문자로 변경하고

4) 만약 j가 홀수이면 문자를 소문자로 변경

5) j에 1을 더해 다음 문자를 판별할 수 있게 한다

6) 원소가 공백이면 j를 다시 0으로 리셋한다

def solution(s):
    j = 0
    list_s = list(s)


    for i in range(len(list_s)):
    
        if j % 2 == 0 or j == 0:
            list_s[i] = list_s[i].upper()
     
        j+=1

    
        if list_s[i] == ' ':
            j = 0

    return ''.join(list_s)

왜 실패했지...?하고 다시 보니

당연히 다 소문자 -> 대문자라고 생각해서였다.

문제에서도 홀수는 소문자라고 나와있는데 말이죠...

 

 

문제 풀이 접근법2

홀수일 경우, 대문자 -> 소문자로 변경하는 케이스를 추가했다...^~^

def solution(s):
    answer = ''
    j = 0
    list_s = list(s)

    for i in range(len(list_s)):
    
        if j % 2 == 0 or j == 0:
            list_s[i] = list_s[i].upper()
        else:
            list_s[i] = list_s[i].lower()
            
        j+=1
        
        if list_s[i] == ' ':
            j = 0
        
        answer = ''.join(list_s)

    return answer

 

저렇게 말로 풀어쓰니까 왤케 말이 안되는거 같지..

암튼 요지는 i를 다시 리셋하면 공백 이후 다른 단어는 변경이 어려우니

따로 첨자 j를 두어서 마치 해당 단어가 첫번째 단어인 것처럼 두고, 변경은 실제 리스트에 접근하는 첨자(이게 맞나..)i로 하는거였다. 

 

처음에는 이중 반복문을 먼저 생각했는데 생각해보니 첨자만 따로 둬도 될 것 같아서 위와 같이 풀이했다

 


 

다른 분들 풀이

# 문제가 개편되었습니다. 이로 인해 함수 구성이나 테스트케이스가 변경되어, 과거의 코드는 동작하지 않을 수 있습니다.
# 새로운 함수 구성을 적용하려면 [코드 초기화] 버튼을 누르세요. 단, [코드 초기화] 버튼을 누르면 작성 중인 코드는 사라집니다.
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(''))
# 아래는 테스트로 출력해 보기 위한 코드입니다.
print("결과 : {}".format(toWeirdCase("try hello world")));

enumerate()함수가 뭔지 몰라서(근데 검색 기록에 있더라...^_^) 검색을 해보았다. 

enumerate()함수는 반복문을 사용할 때, 리스트의 원소에 원소값을 부여해주는 함수라고 한다. 

해당 코드에서 split()으로 공백으로 문자열을 자르고, for문을 돌렸으니까 아마 문자가 w에 들어갈 텐데

enmerate()를 사용하면 원소와 인덱스가 튜플로 사용되기 때문에 0, try << 이런 형태로 나오게 된다. 

그래서 i에 원소의 순서가, c에 원소(문자)가 들어가고 i가 짝수이면 문자를 대문자로, 홀수이면 소문자로 바꾼 다음 join으로 다시 문자열로 변경한다. 

 

요런 생각은 진짜 다들 어떻게 하시는거지...??

분발하좌...

 

'Coding test(Python3) > Programmers' 카테고리의 다른 글

[level 1] 삼총사  (0) 2023.07.20
[level 1] 예산  (0) 2023.07.18
[level 1] 3진법 뒤집기  (0) 2023.07.18
[level 1] 같은 숫자는 싫어(다시??)  (0) 2023.07.17
[level 1] 최대공약수와 최소공배수  (0) 2023.07.17