래원

[LeetCode] 1652. Defuse the Bomb - Python 본문

알고리즘/LeetCode

[LeetCode] 1652. Defuse the Bomb - Python

Laewon Jeong 2024. 11. 18. 20:37

 

문제 설명


You have a bomb to defuse, and your time is running out! Your informer will provide you with a circular array code of length of n and a key k.

To decrypt the code, you must replace every number. All the numbers are replaced simultaneously.

  • If k > 0, replace the ith number with the sum of the next k numbers.
  • If k < 0, replace the ith number with the sum of the previous k numbers.
  • If k == 0, replace the ith number with 0.

As code is circular, the next element of code[n-1] is code[0], and the previous element of code[0] is code[n-1].

Given the circular array code and an integer key k, return the decrypted code to defuse the bomb!

 

문제 예제


Example 1:

Input: code = [5,7,1,4], k = 3

Output: [12,10,16,13]

Explanation: Each number is replaced by the sum of the next 3 numbers. The decrypted code is [7+1+4, 1+4+5, 4+5+7, 5+7+1]. Notice that the numbers wrap around.

 

Example 2:

Input: code = [1,2,3,4], k = 0

Output: [0,0,0,0]

Explanation: When k is zero, the numbers are replaced by 0. 

 

Example 3:

Input: code = [2,4,9,3], k = -2

Output: [12,5,6,13]

Explanation: The decrypted code is [3+9, 2+3, 4+2, 9+4]. Notice that the numbers wrap around again. If k is negative, the sum is of the previous numbers.

 

제한 사항


  • n == code.length
  • 1 <= n <= 100
  • 1 <= code[i] <= 100
  • -(n - 1) <= k <= n - 1

 

내 풀이

class Solution:
    def decrypt(self, code: List[int], k: int) -> List[int]:
        n = len(code)
        answer = []
        
        if k == 0:
            return [0 for _ in range(n)]

        for i in range(n):
            idx = i
            temp = 0

            for _ in range(abs(k)):
                if k > 0:
                    idx += 1
                    if idx >= n:
                        idx -= n
                else:
                    idx -= 1
                    if idx < 0:
                        idx += n

                temp += code[idx]
            answer.append(temp)
            
        return answer

 

 

k = 0 이면, code의 모든 요소를 0으로 설정하고 return 하면 되어 맨 처음 이를 구현했다.

 

k > 0 이면, 현재 요소 다음에 오는 k개의 요소를 더한 값을 저장 하면 된다.

예를 들어, Input: code = [5, 7, 1, 4], k = 3 다음과 같이 주어졌을 때,

  • 5부터 시작해서 5 다음에 오는 3개의 요소를 더한다. --> 7 + 1 + 4 = 12 이다.
  • 다음으로 7로 넘어가고 7 다음으로 오는 3개의 요소의 합은 --> 1 + 4 + 5 = 10 이다.
  • 다음으로 1로 넘어가고 1 다음으로 오는 3개의 요소의 합은 --> 4 + 5 + 7 = 16 이다.
  • 다음으로 4로 넘어가고 4 다음으로 오는 3개의 요소의 합은 --> 5 + 7 + 1 = 13이다.
  • 따라서 result는 [12, 10, 16, 13]

나는 idx 변수를 만들어서 현재 요소의 위치를 저장했고, k번 만큼 +1을 해주어 현재 요소 다음으로 오는 요소들의 값을 구해 더해갔다.

만약 idx가 code의 길이를 넘어가면 code 길이를 빼주어 처음으로 돌아가게끔 구현했다.

 

k < 0 이면, 현재 요소 이전에 오는 k개의 요소를 더한 값을 저장 하면 된다.

예를들어, Input: code = [5, 7, 1, 4], k = 3 다음과 같이 주어졌을 때,

  • 5부터 시작해서 5 이전에 오는 3개의 요소를 더한다. --> 4 + 1 + 7 = 12 이다.
  • 다음으로 7로 넘어가고 7 이전에 오는 3개의 요소의 합은 --> 5 + 4 + 1 = 10 이다.
  • 다음으로 1로 넘어가고 1 이전에 오는 3개의 요소의 합은 --> 7 + 5 + 4 = 16 이다.
  • 다음으로 4로 넘어가고 4 이전에 오는 3개의 요소의 합은 --> 1 + 7 + 5 = 13이다.
  • 따라서 result는 [12, 10, 16, 13]

이 조건 역시 idx 변수를 만들어서 현재 요소의 위치를 저장했고, | k |번 만큼 -1 해주어 현재 요소 이전에 오는 요소들의 값을 구해 더해갔다.

만약 idx가 0보다 작아지면 code의 총 길이를 더해 마지막 요소로 돌아가게끔 구현했다.

 

조건에 맞게 코딩을 하면 돼서 어려운 문제는 아니었다.


[LeetCode] 1652. Defuse the Bomb