[프로그래머스][LV.0] 문자열 여러 번 뒤집기 | python3

2025. 2. 3. 19:57프로그래머스/LV.0

 

문제 링크: 문자열 여러 번 뒤집기

 

문제 설명

문제 설명

문자열 my_string과 이차원 정수 배열 queries가 매개변수로 주어집니다. queries의 원소는 [s, e] 형태로, my_string의 인덱스 s부터 인덱스 e까지를 뒤집으라는 의미입니다. my_string에 queries의 명령을 순서대로 처리한 후의 문자열을 return 하는 solution 함수를 작성해 주세요.

제한사항
- my_string은 영소문자로만 이루어져 있습니다.
- 1 ≤ my_string의 길이 ≤ 1,000
- queries의 원소는 [s, e]의 형태로 0 ≤ s ≤ e < my_string의 길이를 만족합니다.
- 1 ≤ queries의 길이 ≤ 1,000

 


문제 풀이

문제에서 하라는 대로 인덱싱을 활용하여 나누어서 붙였다.
다만 s가 0일때와 e+1부터 시작하는데 이게 문자열의 인덱스를 넘어갈 경우를 잘 나누어서 생각했다. 지금도 살짝 머리아픔....하고 계속 코드를 봤는데 if e-1==len(my_string): 이 부분의 코드가 도저히 이해가 안됐다...
gpt한테 물어보니 틀렸다는데 흠....그럼 대체 저게 왜 통과가 된거냐??? 일단 질문하는 곳에 물어는 봄...


🔍 코드 분석

이 코드는 queries에 있는 (s, e) 범위를 반복적으로 뒤집어서 my_string을 계속 변경하는 역할을 합니다.하지만 잘못된 부분이 있어서 틀린 결과가 나올 가능성이 큽니다.

문제점 1️⃣: if s != 0: 조건

if s != 0: answer += my_string[e:s-1:-1] else: answer += my_string[e::-1]

이 부분은 (s, e) 범위를 뒤집을 때 사용됩니다.문제는 my_string[e:s-1:-1]의 사용 방식이 잘못되었다는 점입니다.슬라이싱을 활용한 [::-1]은 보통 앞에서 뒤로 가는 방식과 뒤에서 앞으로 가는 방식을 신경 써야 하는데,e:s-1:-1이 올바르게 동작하지 않을 수도 있습니다.

✅ 해결 방법:👉 그냥 일반적인 슬라이싱과 [::-1]을 활용하는 방식이 더 안정적입니다.
python복사편집answer += my_string[s:e+1][::-1] # 이렇게 변경!

문제점 2️⃣: if e == len(my_string) - 1: 조건

if e == len(my_string) - 1: continue else: answer += my_string[e+1:]

if e == len(my_string) - 1: 이 조건을 넣었지만,continue를 하면 반복문의 다음 루프로 넘어가므로 my_string이 갱신되지 않음.즉, my_string = answer가 실행되지 않음!

✅ 해결 방법:👉 continue를 없애고, 그냥 answer을 끝까지 이어 붙이는 방식으로 변경해야 합니다.

🔧 수정된 코드
이제 문제점을 해결한 코드로 수정해볼게요.

def solution(my_string, queries):
    for s, e in queries:
        # 앞부분 유지
        answer = my_string[:s]
        
        # (s, e) 범위를 뒤집어서 추가
        answer += my_string[s:e+1][::-1]
        
        # 뒷부분 추가
        answer += my_string[e+1:]

        # 문자열 업데이트
        my_string = answer

    return my_string​



 

내코드

def solution(my_string, queries):
    
    for s,e in queries:
        answer = ''
        answer+=my_string[:s]
        if s!=0:
            answer+=my_string[e:s-1:-1]
            
        else:
            answer+=my_string[e::-1]
        
        if e-1==len(my_string):
            continue
        else:
            answer+=my_string[e+1:]
        my_string=answer
    return answer

 

 


더보기

다른사람풀이

def solution(my_string, queries):
    
    for s,e in queries:
        answer = ''
        answer+=my_string[:s]
        if s!=0:
            answer+=my_string[e:s-1:-1]
        else:
            answer+=my_string[e:s:-1]
        answer+=my_string[e:]
        print(answer)
        my_string=answer
        
    return answer

내 코드와 비교했을때 비슷한 듯 하면서 이 코드가 훨씬 직관적이고 간결하다고 느낀다.

[::-1]이 올 때 너무 헷갈린다. 이 부분은 주피터로 이것저것해보면서 익숙해져야할수밖에 없을듯

 

def solution(my_string, queries):
    answer=list(my_string)
    for s,e in queries:
        answer[s:e+1]=answer[s:e+1][::-1]
    return ''.join(answer)

리스트로 만들어서 저렇게 사용할 수 있을줄은 몰랐다....

def solution(my_string, queries):
    for (s, e) in queries:
        my_string = my_string[:s] + my_string[s:e+1][::-1] + my_string[e+1:]
    return my_string

간결하게 잘 쓴거 같아서 가지고 옴