-
[Python] 프로그래머스 : 같은 숫자는 싫어코딩테스트/프로그래머스 2024. 7. 17. 22:01
[문제 풀기 전 생각한 부분]
# for문으로 순회하면서 arr[i]를 그 다음 [i+1] 와 비교 근데 마지막 인덱스의 다음은 없는데?
# 범위를 하나 줄이면 될까? len(arr) 가 4라고 했을 때, range(len(arr)-1) 0,1,2 될 거 같다.
# 그러면 어떻게 없얘는 게 좋을까? i + 1로 비교하니깐 i와 i + 1 가 같다면 i 번 째를 지우자.
# 그런데 지우게 되면 i + 1 번 째는 i 번째가 될텐데. 지우지 말고 새로운 배열에 추가를 할까?
# 둘 다 일단 해보자.[my_code]
arr = [1, 1, 3, 3, 0, 1, 1] for i in range(len(arr) - 1): if arr[i] == arr[i+1]: del arr[i] print(arr)
[문제점]- 처음 len(arr) 는 7이다.
- 하지만 del arr[i] 하는 과정에서 arr의 길이가 줄어들어 인덱스 범위를 초과하는 것이다.
- 그러면 이제 처음에 생각했던 방식 2가지 중 지우면서 하는 방식보단, 새로운 배열에 추가하는 방식으로 시도해보자.
arr = [1, 1, 3, 3, 0, 1, 1] same_arr = [] for i in range(len(arr) - 1): if arr[i] == arr[i+1]: same_arr.append(arr[i]) print(same_arr) # [1, 3, 1]
- 연속되지 않은 경우 숫자는 제외되었다. 어떻게 해결하면 좋을까?
- 처음에 제거하는 방식을 다르게 해보자.
arr = [1, 1, 3, 3, 0, 1, 1] i = 0 while i < len(arr) - 1: if arr[i] == arr[i + 1]: del arr[i] else: i += 1 print(arr)
- 테스트 케이스는 모두 통과 했으나, 효율성 테스트 에서 시간초과가 뜬다. 왜 그럴까?
- while 문의 시간복잡도 때문이다.
- 그럼 다시 for 문으로 시도해보자.
[새롭게 배운 사실]
- 슬라이싱은 인덱스 범위를 초과해도 무시한다.
- 단, 해당 범위의 인덱스에 직접 접근할 때는 오류가 난다.
ex)
a = [1,2,3] print(a[:20]) # 범위 넘어가지만 [1,2,3] 출력 print(a[20]) # 범위 밖 인덱스 오류
- 범위를 초과해도 되는 슬라이싱을 이용해서 풀어보자.
[문제점 해결]arr = [1,1,3,3,0,1,1] answer = [] for i in arr: if answer[-1:] == [i]: continue answer.append(i) print(answer)
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[Python] 프로그래머스 : 크기가 작은 부분문자열 (0) 2024.07.18 [Python] 프로그래머스 : 3진법 뒤집기 (0) 2024.07.18 [Python] 프로그래머스 : 최대공약수와 최소공배수 (0) 2024.07.17 [Python] 프로그래머스 : 핸드폰 번호 가리기 (0) 2024.07.16 [Python] 프로그래머스 : 제일 작은 수 제거하기 (0) 2024.07.16