[프로그래머스] 같은 숫자는 싫어 - level 1 (python,파이썬)

ggoggori_._·2021년 1월 6일
0

프로그래머스

목록 보기
6/7

문제는 위와 같다.

def solution(arr):
    answer = []
    
    def check(index):
        try:
            if arr[index] == arr[index+1]:
                check(index+1)
            else:
                return arr[index]
        except:
            return arr[index]
        
    for index,i in enumerate(arr):
        if check(index) is not None:
            answer.append(arr[index])
        
    return answer

내가 푼 풀이는 위와 같다.
solution 함수내에서 check 함수를 정의하고, 함수를 호출시키는 재귀함수 방법으로 문제를 해결했다.
풀이를 작성하다가 잘못된 풀이란 것을 알았다...!

예를 들어 arr이 [4,4,4,3,3]이라고 주어졌을 때
for 문에서는 arr의 인덱스 0,1,2,3,4가 차례로 반복된다.

check함수에서 index 0이 인자로 들어갔을 때 2번째 인덱스의 4가 반환되고,
index 1도 마찬가지로 2번째 인덱스의 4가 반환된다.
index 2도 자신을 반환한다.

		if check(index) is not None:
            answer.append(arr[index])

그렇다면 위 코드에 의거하여 None이 아니라 4,4,4 를 각각 반환하기 때문에 answer 리스트에는 arr과 바뀐 게 없는 그대로의 요소가 다시 추가된다.
하지만 위의 코드는 정답을 출력한다.

이유는 check 함수를 재귀로 다시 호출하는 과정에 있다.

			if arr[index] == arr[index+1]:
                check(index+1)

check(index+1)이 아니라 return check(index+1)이 올바른 재귀함수의 사용법일 듯하다.
return을 작성하지 않게 되면, 한번이라도 재귀함수를 적용하는 경우 None을 반환한다.

그러니까 위의 경우에서는 index 0은 재귀함수를 2번, index 1은 재귀함수를 1번 호출했기 때문에 return arr[index]에서 None을 반환하고 index 2의 경우에는 index 2의 값인 4와 index 3의 값인 3이 달라서 재귀함수를 호출하지 않고 바로 arr[index]를 반환한다.

그렇기 때문에 연속된 숫자가 나오지 않는 인덱스 2,4의 값들만 정상적으로 return했기 때문에
[4,4,4,3,3]의 리스트에서 연속된 값이 제거된 정답이 출력된 것이다.

뒷걸음치다 가재 잡은 격이다...

정리하자면
재귀함수 호출에 있어서 return check() 와 같이 사용할 필요가 있으나, check()와 같이 return을 사용하지 않아서 문제가 발생했다. return을 사용하지 않으면 한번이라도 재귀함수를 호출했을 경우 arr[index]값이 아닌 None을 반환한다.

의도적으로 사용했다면 멋진 코드가 되겠지만, 나는 그렇지 못했기 때문에 틀린 코드라고 할 수 있겠다!

0개의 댓글