코딩테스트(프로그래머스 1단계(12번: 같은 숫자는 싫어)
문제 설명
배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를 들면,
arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.
배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.
제한사항
배열 arr의 크기 : 1,000,000 이하의 자연수
배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수
입출력 예
arr answer
[1,1,3,3,0,1,1][1,3,0,1]
[4,4,4,3,3][4,3]
입출력 예 설명
입출력 예 #1,2
문제의 예시와 같습니다.
나의 풀이 :
def solution(arr):
answer = []
arr = list(set(arr)) # set() 는 dictionary 형식으로 바꾼다. 그래서 list() 로 바꾸고 또 원소들의 순서까지 바꾸어 버린다.
for i in range(len(arr)):
answer.append(arr[i])
# [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
print('Hello Python')
return answer
그리하여 대신 "for"문을 이용하여 중복을 제거하려 했으나...
def solution(arr):
answer = []
for i in arr:
if i not in answer:
answer.append(i)
# [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
print('Hello Python')
return answer
이것도 마찬가지로 틀렸다. 왜냐, [1,1,3,3,0,1,1][1,3,0,1] 처럼 1이 중복되었음에도 불구하고 마지막에 1은 그대로 출력된다.
***여기서 중복을 제거한다는 것은 연속된 중복을 제거한다는 의미이다.
다른 사람 풀이 :
def solution(arr):
result = []
result.append(arr[0]) # 첫번째 리스트의 인덱스는 항상 arr의 인덱스 값을 가지므로 arr의 첫 번째 인덱스로 잡아준다.
for i in range(1,len(arr)):
if arr[i] != arr[i-1]: # i 인덱스의 원소와 i-1 인덱스의 원소가 다를경우
result.append(arr[i]) # 다르면 result 리스트에 추가.
return result
TAKEAWAY :
- set() 는 중복값을 제거하는데 유용하지만, 순서가 뒤죽박죽 될 수 있다. iteration 시간도 for문보다 오래걸린다고 알고 있다.
- 단지 중복을 제거하는 것이 아닌 "연속된 중복"을 제거하는 것. 문제 제대로 읽자!
- 처음에 result 리스트에 arr[0] 을 넣어주어서 arr 리스트의 각 원소들과 비교할 수 있는 구조를 짜주자.
느낀점 :
- 문제 파악을 잘 못하였다. 다음부터는 문제를 제대로 읽고 풀자!
Author And Source
이 문제에 관하여(코딩테스트(프로그래머스 1단계(12번: 같은 숫자는 싫어)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@oojjww1/코딩테스트프로그래머스-1단계12번-같은-숫자는-싫어저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)