TIL

[코테연습] 1652. Defuse the Bomb

크라00 2024. 11. 18. 10:51

문제타입

https://leetcode.com/problems/defuse-the-bomb/?envType=daily-question&envId=2024-11-18

Array
Sliding Window

문제분석

이 문제는 암호화된 배열을 복호화하는 문제입니다. 주어진 배열을 특정 규칙에 따라 복호화하여 새로운 배열을 반환하는 문제입니다.

  • 입력 배열 code: 정수 배열이며, 암호화된 데이터를 나타냅니다.
  • k: 정수로, 복호화 방식이 결정됩니다.
    • k > 0일 때: k개의 인덱스를 시계방향으로 더한 값으로 새로운 배열을 만듭니다.
    • k < 0일 때: |k|개의 인덱스를 반시계방향으로 더한 값으로 새로운 배열을 만듭니다.
    • k == 0일 때: 모든 값은 0으로 설정된 배열을 반환합니다.

핵심 조건:

  1. k > 0: k만큼 시계방향으로 code 배열에서 값을 더해서 새로운 배열을 생성합니다.
  2. k < 0: |k|만큼 반시계방향으로 code 배열에서 값을 더합니다.
  3. k == 0: 결과 배열은 모두 0으로 채워집니다.

문제풀이

  1. 배열 초기화:
    • 주어진 배열 code의 길이 n을 계산하고, 결과 배열 arr를 0으로 초기화합니다.
    • k == 0일 경우, 결과 배열 arr는 그대로 반환됩니다.
  2. 시계방향(k > 0):
    • start_idx를 1로 설정하여 시계방향으로 진행합니다.
    • 각 인덱스에 대해, start_idx + i부터 abs(k) + start_idx + i까지 값을 더해 결과 배열 arr에 저장합니다.
    • 인덱스가 배열을 벗어날 경우 모듈러 연산(% n)을 사용하여 원형 배열처럼 동작하도록 처리합니다.
  3. 반시계방향(k < 0):
    • start_idx를 -1로 설정하여 반시계방향으로 진행합니다.
    • abs(k)만큼 반시계방향으로 더하는 방식입니다.
    • arr 배열을 temp 배열로 복사한 뒤, 반시계방향으로 필요한 만큼 값을 이동시킵니다. 이때 temp 배열에 값을 할당하는 방식으로 인덱스 재배치를 합니다.
  4. 결과 반환:
    • 모든 계산이 끝난 후, 복호화된 결과 배열 arr를 반환합니다.

 

> java

 

class Solution {
    public int[] decrypt(int[] code, int k) {
        int n = code.length;
        int[] arr = new int[n];

        if (k == 0) {
            Arrays.fill(arr, 0);
            return arr;
        }

        int startIdx = 1;

        for (int i = 0; i < n; i++) {
            int sum = 0;
            for (int j = startIdx+i; j < Math.abs(k) + startIdx+i; j++) {
                int idx = j % n;
                sum += code[idx];
            }
            arr[i] = sum;
        }

        // arr.length-1, arr.length-2, arr.length-3, (n-1 - Math.abs(k))
        if (k < 0) {
            int[] temp = new int[n];
            //11 -> 4 = 11-4=7, 7~11, 0~6
            int idx = 0;
            for (int i = n-Math.abs(k)-1; i < n; i++) {
                temp[idx++] = arr[i];
            }
            for (int i = 0; i < n-Math.abs(k)-1; i++) {
                temp[idx++] = arr[i];
            }
            arr = temp;
        }

        return arr;
    }
}

 

 

> python

 

class Solution:
    def decrypt(self, code: List[int], k: int) -> List[int]:
        n = len(code)
        arr = [0] * n

        if k == 0 : return arr

        start_idx = 1

        for i in range(n) :
            total = 0
            for j in range(start_idx+i,abs(k)+start_idx+i) :
                idx = j % n
                total += code[idx]
            arr[i] = total
        
        if k < 0 :
            temp = [0] * n
            idx = 0
            for i in range(n-abs(k)-1, n) :
                temp[idx] = arr[i]
                idx+=1
            for i in range(n-abs(k)-1) :
                temp[idx] = arr[i]
                idx+=1
            arr = temp
        return arr