- 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12906
- 오늘의 회고
- 어떤 문제가 있었고, 나는 어떤 시도를 했는지
- 문제 : 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지
[1,1,3,3,0,1,1]라면 | [1,3,0,1] |
[4,4,4,3,3]라면 | [4,3] |
- 어떻게 해결했는지
- 문제 해석
- 앞의 숫자와 연속되지만 않으면 숫자는 포함됩니다 (1, 3, 0, 1 케이스). 즉, 리스트의 바로 앞 원소와 비교하여 숫자가 같다면 제외하고, 숫자가 다르다면 남겨둬야 합니다.
- 배열 arr의 순서는 유지되어야 하므로 특별한 정렬 조건은 없습니다.
- 아이디어
- 빈 리스트를 생성합니다.
- arr을 돌면서 arr의 바로 전 원소의 숫자와 비교합니다.
- 앞의 원소 숫자와 비교하여 같다면 넘어가고, 다르다면 빈 리스트에 원소를 하나씩 추가해줍니다.
- 단, 첫 번째 원소는 앞에 비교할 숫자가 없으므로 바로 리스트에 넣어줍니다.
- 새로운 리스트를 출력합니다.
def solution(arr):
# 새 리스트 생성
answer = []
# 반복문 돌기
for i in range(len(arr)):
# 처음이면 무조건 새 리스트에 넣기
if i == 0:
answer.append(arr[i])
# 두 번째 이상이면 앞의 리스트와 비교하여 같은 숫자인지 확인하고, 같은 숫자라면 넘어가기
elif arr[i] == arr[i - 1]:
continue
# 같은 숫자가 아니라면 새 리스트에 넣기
else:
answer.append(arr[i])
print('Hello Python')
return answer
코드 개선
i = 0부터 반복문을 돌릴 필요 없습니다 -> answer에 arr[i]를 넣어주고 다음부터 반복문을 돌립니다.
def solution(arr):
answer = [arr[0]]
for i in range(1, len(arr)):
if arr[i] == arr[i - 1]:
continue
else:
answer.append(arr[i])
print('Hello Python')
return answer
GPT 제안
리스트 컴프리헨션을 사용하여 훨씬 깔끔한 코드를 생성할 수 있습니다.
def solution(arr):
answer = [arr[0]]
answer.extend(arr[i] for i in range(1, len(arr)) if arr[i] != arr[i - 1])
print('Hello Python')
return answer
이때 append 대신 extend 메소드를 사용하는 이유는 리스트 컴프리헨션에서 arr의 반복해서 리스트 원소를 넣어야 하기 때문입니다.
"if we used append inside the list comprehension, it would not be correct because append does not add elements from an iterable but treats the entire iterable as a single element."
append를 썼을 때 나타나는 error code는 다음과 같습니다.
"TypeError: Object of type generator is not JSON serializable"
'연습하기 > Python 문제풀이' 카테고리의 다른 글
[Python] 99클럽 코테 스터디 7일차 TIL : Break (0) | 2024.07.29 |
---|---|
[Python] 99클럽 코테 스터디 6일차 TIL 반복문, 딕셔너리 (0) | 2024.07.28 |
[Python] 99클럽 코테 스터디 5일차 TIL 반복문, 딕셔너리 (0) | 2024.07.27 |
[Python] 99클럽 코테 스터디 1일차 TIL 형변환 (0) | 2024.07.25 |
[Python] 99클럽 코테 스터디 3일차 TIL 반복문과 조건문 (3) | 2024.07.25 |
댓글