level0_부분 문자열 이어 붙여 문자열 만들기

2024. 12. 3. 21:04파이썬_알고리즘(코딩테스트)/level0

 

내가 제출한 코드

def solution(my_strings, parts):
    answer = ''
    for i in range(len(my_strings)):
        answer+= my_strings[i][parts[i][0]:parts[i][1]+1]
        
    return answer
  • part[i][0]와 part[i][1]은 각각 시작과 끝 인덱스를 나타낸다.
  • my_strings[i][ part[i][0] : part[i][1]+1]
    • part[i][1]+1은 종료 인덱스는 포함되지 않으므로 +1을 더해 끝 인덱스를 포함시킨다.

다른 사람이 제출한 코드1

def solution(my_strings, parts):
    answer = ""
    for i, (s, e) in enumerate(parts):
        answer += my_strings[i][s:e+1]
    return answer
  • for i, (s, e) in enumerate(parts):
    • i는 현재 parts에서의 인덱스이다.
    • (s,e)는 parts의 요소로, 각각 시작과 끝 인덱스트를 나타낸다.
      • 예를 들어 parts = [[0, 4], [1, 2], [3, 5], [7, 7]]일때
        • 첫 번째 순회: i=0, (s, e)=(0, 4)
        • 두 번째 순회: i=1, (s, e)=(1, 2)
        • 세 번째 순회: i=2, (s, e)=(3, 5)
        • 네 번째 순회: i=3, (s, e)=(7, 7)
  • my_strings[i][s:e+1]
    • my_strings의 i번째 문자열에서 s부터 e+1까지 슬라이싱한다.

댓글에

 

  • answer += 의 문제점
    • 코드에서 answer는 문자열로 초기화되고, 반복문 안에서 answer+= my_strings[i][s:e+1]을 실행한다.
    • 이 코드는 내부적으로 매번 새로운 문자열 객체를 생성하고, 기존의 문자열 데이터를 복사하여 새 객체를 만들게 된다.
    • 반복 횟수가 많아질수록 추가적인 메모리 사용복사 작업으로 인해 성능이 저하된다.

 

 

수정하라고 말씀하신 걸 코드로 적어보면

def solution(my_strings, parts):
    answer = []  # 리스트로 초기화
    for i, (s, e) in enumerate(parts):
        answer.append(my_strings[i][s:e+1])  # 리스트에 부분 문자열 추가
    return ''.join(answer)  # 리스트의 문자열을 결합하여 반환

 

다른 사람이 제출한 코드2

def solution(my_strings, parts):
    return ''.join([x[y[0]:y[1]+1] for x,y in zip(my_strings, parts)])

 

  • zip(my_strings, parts)
    • zip() 함수는 두 리스트(my_strings와 parts)를 동시에 순회하기 위해 사용
    • zip()은 두 리스트의 요소를 튜플로 묶어준다.
my_strings = ["progressive", "hamburger", "hammer", "ahocorasick"]
parts = [[0, 4], [1, 2], [3, 5], [7, 7]]
list(zip(my_strings, parts)) 
# 결과: [("progressive", [0, 4]), ("hamburger", [1, 2]), ("hammer", [3, 5]), ("ahocorasick", [7, 7])]

예시다.

  • [x[y[0]:y[1]+1] for x, y in zip(my_strings, parts)]
    • 여기서 x는 my_strings의 개별 문자열, y는 parts의 [start, end] 범위이다.
    • x[y[0]:y[1]+1]는 x 문자열에서 y[0](시작)부터 y[1]+1(끝 포함)까지의 부분 문자열을 추출한다.