관리 메뉴

밤 늦게까지 여는 카페

[leetcode] 1652. Defuse the Bomb 본문

알고리즘/문제풀이

[leetcode] 1652. Defuse the Bomb

Jㅐ둥이 2024. 11. 19. 00:55
반응형

안녕하세요. 오늘은 leetcode의 1652. Defuse the Bomb 문제를 풀어봤습니다.

 

1. 문제

이 문제에서는 수열 code와 하나의 수 k가 주어지고, k의 값에 따라서 수열을 반환해야 합니다.

  • k > 0 일 때, i번째에 code의 i+1, i+2, ..., i+k번째 수들의 합을 가지는 수열을 반환합니다.
  • k < 0 일 때, i번째에 code의 i+k, i+k-1, ..., i -1번째 수들의 합을 가지는 수열을 반환합니다.
  • k = 0 일 때, 길이가 code와 동일한 0으로 이루어진 수열을 반환합니다.
  • i+k가 code의 길이보다 커지면 처음부터 시작합니다.
  • i+k가 code의 길이보다 작아지면 맨 뒤부터 시작합니다.

 

예시)

  • code=[1, 2, 3, 4, 5], k=3
    • [2+3+4, 3+4+5, 4+5+1, 5+1+2, 1+2+3] => [9, 12, 10, 8, 6]
  • code=[1, 2, 3, 4, 5], k=-3
    • [3+4+5, 4+5+1, 5+1+2, 1+2+3, 2+3+4] => [12, 10, 8, 6, 9]
  • code=[1, 2, 3, 4, 5], k=0
    • [0, 0, 0, 0, 0]

 

2. 풀이

이번 문제는 사실 주어진 조건대로 구현하기만 하면 되는 문제입니다.

 

다만 신경 쓰면 좋을 부분은 k개의 합을 구할 때 매번 구하지 않고,

이전에 구한 합에서 맨 앞의 숫자를 빼고 뒤의 숫자만 더해가는 것입니다.

이전에 구한 합을 최대한 활용하기

 

이렇게 하니 runtime 효율성은 확실히 챙겨지더라고요!

runtime 제대로!

+ 코드

더보기
class Solution:
    def decrypt(self, code: List[int], k: int) -> List[int]:
        result = []
        if k > 0:
            s = sum(code[:k])
            for i in range(len(code)):
                s = s - code[i] + code[(i+k)%len(code)]
                result.append(s)
        elif k < 0:
            s = sum(code[k-1:-1])
            for i in range(len(code)):
                s = s + code[i-1] - code[(i+k-1)%len(code)]
                result.append(s)
        else:
            result = [0] * len(code)
        return result
반응형