문제 : 

 

이 문제도 마찬가지, 로직은 직관적이고 간단하지만 배열 선언에 있어서 까먹었던 부분이 있어 풀이를 작성한다. 먼저 이 문제는 입력값으로 리스트가 주어지고, 이 리스트에서 인덱스와 요소를 비교하여, 요소가 짝수이면 짝수 인덱스에, 요소가 홀수 인덱스면 홀수 인덱스에 넣어 결과 배열을 리턴하면 된다. 아래는 내가 제출한 코드이다.

class Solution:
    def sortArrayByParityII(self, nums: List[int]) -> List[int]:
        even = 0
        odd = 1
        res = [0] * len(nums)

        for i in nums:
            if i % 2 == 0:
                res[even] = i
                even += 2
            else:
                res[odd] = i
                odd += 2
        return res

 

여기서의 로직은 간단하다. 입력값으로 주어진 배열을 하나씩 순회하며 홀수인지 짝수인지 확인한 후, 짝수라면 처음 선언한 결과 배열의 짝수 인덱스에 현재 검사 중인 요소를 넣어주고, `even += 2`를 통해 포인터를 업데이트 시켜준다. `even` 포인터는 0부터 시작했기 때문에 `+= 2`를 하면 0, 2, 4, 6...과 같이 될 것이다. 홀수도 마찬가지이다. 하지만 내가 여기서 까먹었던 부분은 다음과 같다.

나는 처음에 결과 배열을 `res = []`라고 빈 배열로 선언했다. 코드를 제출하기 전에 디버깅을 돌렸을 때 자꾸 `res[even] = i` 부분에서 에러가 났다. 이유는, 배열이 초기화되지 않았기 때문이다. 빈 배열 `res`는 초기화되지 않았기 때문에 특정 인덱스에 접근할 수 없다. 따라서 `res` 배열을 미리 초기화하거나, 배열의 크기를 동적으로 조절하는 로직이 필요하다. 그렇지 않으면 인덱스 에러가 발생하게 된다.

 

`res = []`로 배열을 초기화하면 빈 배열이 생성되지만, 특정 인덱스에 접근하거나 값을 할당할 수 없다. 예를 들어, `res[even] = i`와 같이 특정 인덱스에 값을 할당하려고 하면 인덱스 오류가 발생한다.

이유
`res = []`는 빈 배열을 초기화하지만, 배열의 길이는 0이다. 따라서 `res[even]`과 같이 배열의 특정 인덱스에 접근하려고 하면 `IndexError`가 발생한다. 빈 배열은 초기화되었지만, 크기를 명시하지 않았기 때문에 특정 인덱스에 직접 값을 할당할 수 없다.

해결 방법
1. 미리 배열의 크기를 초기화하기:
   배열의 크기를 미리 알 수 있다면, 배열을 고정된 크기로 초기화할 수 있다.

   res = [0] * n  # n은 배열의 크기


2. append()를 사용하여 동적으로 배열에 값을 추가하기:
   배열의 크기를 미리 알 수 없다면, `append()` 메서드를 사용하여 동적으로 배열에 값을 추가할 수 있다.


   res = []
   res.append(i)  # 배열의 끝에 값을 추가

잘못된 접근 방식:

res = []
even = 2
i = 5

# 이 코드는 IndexError: list assignment index out of range를 발생시킨다.
res[even] = i


올바른 접근 방식:
1. 미리 배열의 크기를 초기화하는 방법:

   n = 10  # 예시로 배열의 크기를 10으로 설정
   res = [0] * n
   even = 2
   i = 5

   res[even] = i  # 이제 인덱스 2에 값을 할당할 수 있습니다.
   print(res)

2. append()를 사용하여 동적으로 값을 추가하는 방법:

   res = []
   res.append(5)  # 배열의 끝에 값을 추가
   print(res)  # 출력: [5]



결론 :  파이썬에서 배열의 인덱스를 참조하고싶다면, 선언된 배열은 초기화가 되어 있어야 한다. 빈 배열을 선언하면 빈 배열의 100번째 인덱스에 값을 넣을 수 없다. 단, .append()메서드로 배열의 맨 뒤에 넣는것은 가능!

 

 

+ Recent posts