코딩테스트(프로그래머스 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 리스트의 각 원소들과 비교할 수 있는 구조를 짜주자.

느낀점 :

  • 문제 파악을 잘 못하였다. 다음부터는 문제를 제대로 읽고 풀자!

좋은 웹페이지 즐겨찾기