Algorithm/프로그래머스

세무민의 알고가자 : 프로그래머스 같은 숫자는 싫어 문제 풀기 [부제 : for와 while의 시간 차이]

세기루민 2021. 3. 5. 23:06
728x90

오늘 풀어 볼 문제는 같은 숫자는 싫어!

사실 이 문제는 그냥 포스팅 할 생각이 없었지만 

for문과 while문의 속도 차이로 문제 풀이가 달라져서 포스팅 하게 됬다.


문제 설명 & 입출력 예시


풀이

이번 문제는 set을 사용하면 안되는 문제! 

set은 중복되는 값을 다 제거하기 때문!

따라서 이번 문제는 while문이나 for문으로 접근하는 것이 중요합니다.

문제가 쉬워서 말 그대로 같은 값이면 continue를 해주면 되겠죠?


코드

def solution(arr):
    answer = []
    count = 0

    while len(arr) > 0:
        temp = arr[0]
        if len(answer) == 0:
            answer.append(temp)
        elif answer[count] == temp:
            arr = arr[1:]
            continue
        else:
            answer.append(temp)
            count += 1

        arr = arr[1:]
        
    return answer

처음에는 위와 같이 풀었어요

pop이나 remove를 사용하게 되면 오히려 시간이 오래걸려서 

새로운 리스트에 추가해주는 것이 더 빠르다고 하더라구요?!

그래서 리스트를 계속 변경해주면서 진행했는데..

확실한 건 정확도는 다 맞았으나 효율성에서 떨어졌습니다.

즉 시간이 오래걸린다는 의미!

def solution(arr):
    answer = []
    count = 0

    for i in range(len(arr)):
        if len(answer) != 0:
            temp = arr[i]
            if answer[count] != temp:
                answer.append(temp)
                count += 1
        else:
            answer.append(arr[i])

        
    return answer

그래서 아래와 같이 간단하게 만들었어요! 

사실 for문과 while문이 둘다 반복문이라서 사용해도 무방하지만 

코딩 테스트에서는 시간 복잡도나 효율성을 체크하기 때문에 

반복 횟수가 정해진 문제라면 for

반복 횟수가 정해지지 않은 경우에는 while

위에 처럼 결국에는 배열의 크기가 존재하기 때문에 이번 문제는 for를 사용하는 것이 더 효율적이겠죠?

그리고 count라는 변수는 여기서 새로만든 리스트 인덱스를 하나씩 넘기기 위해서 만들었어요

인덱스를 하나씩 넘기면서 값이 중복되는지 여부를 확인해야 하기 때문이죠

끝!


다음에는 더 유용한 알고리즘 포스팅으로 찾아오겠습니다.

 

728x90