Notice
Recent Posts
Recent Comments
Link
«   2025/10   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

언어 전공자의 NLP 로그

[스택] 같은 숫자는 싫어 본문

코딩테스트

[스택] 같은 숫자는 싫어

JohnnyNLP 2023. 8. 12. 16:20

https://school.programmers.co.kr/learn/courses/30/lessons/12906

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

def solution(arr):  
    answer = []
    stack = []

    for i in range(len(arr)):
        if stack and arr[i] != arr[stack[-1]]:
            answer.append(arr[stack[-1]])
            stack.clear()

        stack.append(i)

    answer.append(arr[stack[-1]])

    return answer

 

배열 크기가 최대 1,000,000의 자연수이기 때문에 이중  for문을 사용한 O(n^2) 접근 방법은 효율성 제한에 걸린다.

O(n)의 비용으로 솔루션을 얻기 위해 스택을 사용한다.

본 문제에서 사용한 로직은 stack에 계속해서 인덱스를 쌓아나가되,

이 인덱스에서 참조한 arr의 값이 새로 들어오는 값과 달라지게 되면 비교 대상인 수를 answer에 추가하면서 기존의 stack을 비운다.

 

입출력 예시에서

[1, 1, 3, 3, 0, 1, 1]

의 리스트를 입력받게 되면

 

stack에는 0, 1의 인덱스가 쌓이게 되고,

최초로 3이 들어오게 될 때 arr[stack[-1]]에 해당하는 값인 1을 answer에 추가하고 stack을 비운다.

 

이후 stack에는 다시 2, 3의 인덱스가 쌓이고,

최초로 0이 들어올 때 마찬가지로 arr[stack[-1]]에 해당하는 값인 3을 answer에 추가하고 stack을 비운다.

 

이렇게 계속해서 진행하게 되면 stack에는 마지막으로 추가해줄 인덱스만이 남게 되는데

이를 arr에서 참조해서 추가해주면 배열 크기 n만큼의 반복만으로도 모든 중복된 값을 제거할 수 있다.

'코딩테스트' 카테고리의 다른 글

[구름톤 챌린지] 구름 찾기 깃발  (0) 2023.08.22
[구름톤 챌린지] 이진수 정렬  (0) 2023.08.18
[큐] 프로세스  (0) 2023.08.17
[스택] 올바른 괄호  (0) 2023.08.16
[스택] 기능개발  (0) 2023.08.14