숫자로 구성된 리스트 nums가 주어졌다고 가정해 봅시다. 이 리스트를 왼쪽과 오른쪽 양 끝에서 교차하듯 짜내어(압축하여) 마지막에는 단 하나의 요소만 남도록 만들어야 하며, 각 단계별 리스트의 상태를 모두 반환해야 합니다.
예를 들어 입력이 nums = [10, 20, 30, 40, 50, 60]이라면 결과는 다음과 같습니다.
[[10, 20, 30, 40, 50, 60],
[30, 30, 40, 110],
[60, 150],
[210]]
동작 원리 이해하기
첫 단계에서는 맨 왼쪽의 두 요소(10 + 20 = 30)와 맨 오른쪽의 두 요소(50 + 60 = 110)를 각각 더하고, 가운데 요소들(30, 40)은 그대로 유지하여 [30, 30, 40, 110]을 만듭니다. 같은 과정을 반복하면 [60, 150]이 되고, 마지막으로 남은 두 요소를 합쳐 [210]이라는 단일 요소 리스트가 완성됩니다.
해결 절차
이 문제는 다음 단계를 거쳐 해결할 수 있습니다.
ret을 초기 리스트nums를 유일한 요소로 갖는 리스트로 초기화합니다.nums의 길이가 1보다 큰 동안 다음을 반복합니다.- 길이가 2라면:
nums := [nums[0] + nums[1]] - 길이가 3이라면:
nums := [nums[0] + nums[1] + nums[2]] - 그 외의 경우:
nums := [nums[0] + nums[1]] + nums[2:-2] + [nums[-2] + nums[-1]]— 앞의 두 요소를 합친 값, 인덱스 2부터 뒤에서 세 번째 요소까지의 중간 부분, 뒤의 두 요소를 합친 값을 차례대로 연결합니다.
- 길이가 2라면:
- 매 반복마다 갱신된
nums를ret의 끝에 추가합니다. - 반복이 종료되면
ret을 반환합니다.
구현 예제
다음 구현 예제를 통해 전체 동작을 더 명확하게 이해할 수 있습니다.
class Solution:
def solve(self, nums):
ret = [nums]
while len(nums) > 1:
if len(nums) == 2:
nums = [nums[0] + nums[1]]
elif len(nums) == 3:
nums = [nums[0] + nums[1] + nums[2]]
else:
nums = [nums[0] + nums[1]] + nums[2:-2] + [nums[-2] + nums[-1]]
ret.append(nums)
return ret
ob = Solution()
print(ob.solve([10, 20, 30, 40, 50, 60]))
입력
[10, 20, 30, 40, 50, 60]
출력
[[10, 20, 30, 40, 50, 60], [30, 30, 40, 110], [60, 150], [210]]