문제 :
이 문제도 마찬가지, 로직은 직관적이고 간단하지만 배열 선언에 있어서 까먹었던 부분이 있어 풀이를 작성한다. 먼저 이 문제는 입력값으로 리스트가 주어지고, 이 리스트에서 인덱스와 요소를 비교하여, 요소가 짝수이면 짝수 인덱스에, 요소가 홀수 인덱스면 홀수 인덱스에 넣어 결과 배열을 리턴하면 된다. 아래는 내가 제출한 코드이다.
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()메서드로 배열의 맨 뒤에 넣는것은 가능!
'CodingTest > Leetcode' 카테고리의 다른 글
[LeetCode] 2000. Reverse Prefix of Word (0) | 2024.07.26 |
---|---|
[LeetCode] 1455. Check If a Word Occurs As a Prefix of Any Word in a Sentence (1) | 2024.07.22 |
[LeetCode] 876. Middle of the Linked List (0) | 2024.07.17 |
[LeetCode] 832. Flipping an Image (0) | 2024.07.12 |
[LeetCode] 557. Reverse Words in a String III (0) | 2024.07.10 |