[프로그래머스] 1154539 : Lv2 뒤에 있는 큰 수 찾기| 스택

2024. 9. 23. 20:00·코딩테스트/프로그래머스

[프로그래머스] 1154539 : Lv2 뒤에 있는 큰 수 찾기

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

 

프로그래머스

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

programmers.co.kr


[python] 문제 풀이

배열의 수 만큼 루프를 돌려서 직접 원소들의 크기를 비교하는 코드를 짬. 

1. results 리스트를 생성해서 모든 값을 -1 로 초기화. 각 요소는 숫자에 대한 결과 값을 저장하게 됨. (큰 수가 없으면 -1로 남게 함) 

2. 마지막 요소를 제외하고 numbers에 있는 모든 요소들의 크기를 비교해야함.

3. 현재 요소값과 그 뒤에 있는 모든 요소 값을 비교.

def solution(numbers):
    results = [-1] * len(numbers) # results 리스트 생성 초기화
    for i in range(len(numbers)-1):  # 마지막 요소 제외하고 numbers 리스트 각 요소에 대해 반복
        values = numbers[i] #i번째 요소 값을 values에 저장
        for j in numbers[i+1:]: #현재 요소 values다음에 오는 모든 요소 반복
            if values < j: #현재 요소 값이 j번째 요소랑 크기 비교함.
                results[i] = j #크기가 큰 요소를 result리스트에 저장
                break
    
    return results

ㅋ,,,,,,,, 시간초과 

gpt 말로는

"당신의 코드는 두 개의 중첩된 루프를 사용하여 numbers 리스트를 탐색합니다. 이로 인해 시간 복잡도가 O(n^2)로 증가하게 되며, 리스트의 길이가 커질수록 실행 시간이 급격히 증가합니다. "란다

 


stack 을 사용하면 더 간단하게 코드를 작성할 수 있다.

 

[최종코드]

 

def solution(numbers):
    results = [-1] * len(numbers)
    stack = [] #stack 초기화 #인덱스를 저장하는데 사용
    
    for i in range(len(numbers)):
        while stack and numbers[stack[-1]]<numbers[i]:
            results[stack.pop()] = numbers[i]
        stack.append(i)
    
    return results

 

while stack and numbers[stack[-1]] < numbers[i]:
    results[stack.pop()] = numbers[i]

stack 이 비어있지 않고, stack의 마지막 인덱스에 해당하는 값 < numbers의 i번째 값 이면

-> stack에서 인덱스 꺼내, 해당 인덱스 결과를 숫자 numbers[i]로 저장

 

** 큰 숫자를 찾을 때, 현재 숫자와 비교하고 그보다 작은 숫잗르의 위치를 스택에서 제거하며 처리

-> 시간 복잡도가 줄어듦


 

ex) numbers = [2,3,3,5]

1. 초기 설정

 result = [-1,-1,-1,-1]

 stack = []

2. 반복 과정

 i=0 :

- 스택이 비어 있으므로 인덱스 0 추가

-  stack.append(0)

 i=1 :

- 스택 있음, stack[-1]=0  

- numbers [0] =2 가 numbers[1]=3 보다 작음.

- stack.pop() 으로 스택 가장 위의 값 0을 꺼내고, results[0]=number[1]=3으로 업데이트 

- results =[3,-1,-1,-1]

- stack.append(1) -> stack = [1]

i=2 : 

 -  스택의 마지막 값을 인덱스로 갖는  numbers[1]=3은 현재 인덱스 i의 number[2]=3이랑 같음

 -  stack.append(2) -> stack =[1,2]

i=3 :

 -  스택의 마지막 값을 인덱스로 갖는 number[2] = 3 은 현재의 인덱스의 numbers[3]= 5 보다 작음.

stack = [1,2]

 -  stack.pop() 으로 두번 pop 해야함

 1) 첫번째 팝 : 스택의 마지막 값 (인덱스 2) 꺼냄 

     -> stack = [1]

     -> results 에 현재 숫자인 5 를 넣음

 results = [3,-1,5,-1]

  2) 두번째 팝 : 스택의 마지막 값 (인덱스 1) 꺼냄 

       ->stack =[]

       -> numbers[1] =3  이므로 results[1] 에 현재 숫자 5를 넣음.

  results = [3,5,5,-1]

 

 

https://tildacoding.tistory.com/15

 

[자료구조] [python] Stack(스택)

LIFO (후입 선출)구조를 따르는 자료 구조 즉, 나중에 삽입된 데이터가 가장 먼저 꺼내지는 구조. 스택 연산 종류1. push() : 스택에 원소를 추가.2. pop() : 스택 가장 위에 있는 원소를 삭제하고 그

tildacoding.tistory.com

 

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

[프로그래머스]67258 : 보석 쇼핑 | 투포인트 탐색  (1) 2024.10.28
[프로그래머스]150368: 이모티콘 할인 행사 | DFS  (2) 2024.10.21
[프로그래머스]43165: 타겟 넘버 | DFS  (0) 2024.10.14
[프로그래머스] 12921번 : Lv1 소수 찾기 | 에라토스테네스의 체  (0) 2024.09.15
[프로그래머스]86491번 최소직사각형 | 완전 탐색  (1) 2024.09.12
'코딩테스트/프로그래머스' 카테고리의 다른 글
  • [프로그래머스]150368: 이모티콘 할인 행사 | DFS
  • [프로그래머스]43165: 타겟 넘버 | DFS
  • [프로그래머스] 12921번 : Lv1 소수 찾기 | 에라토스테네스의 체
  • [프로그래머스]86491번 최소직사각형 | 완전 탐색
#코딩 공부
#코딩 공부
tildacoding 코딩 공부
  • #코딩 공부
    tildacoding
    #코딩 공부
  • 전체
    오늘
    어제
  • 글쓰기 관리자
  • Personal

    • 홈
    • 태그
    • 방명록
  • link

    • GITHUB
    • 분류 전체보기 (51)
      • Dev (12)
        • python (0)
        • 웹크롤링 (2)
        • 머신러닝 (3)
        • 딥러닝 (4)
        • 언어지능 딥러닝 (2)
        • SQL (1)
        • Spring (0)
      • 코딩테스트 (16)
        • 백준 (3)
        • 프로그래머스 (7)
        • 기타 문제 (2)
        • 코딩테스트를 위한 정리 (4)
      • Study (4)
        • 알고리즘 (2)
        • 자료구조 (2)
      • 대외활동 (18)
        • 에이블스쿨 (18)
        • 공모전 (0)
  • 공지사항

    • 루틴 skrrrrr
  • 인기 글

  • 태그

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.0
#코딩 공부
[프로그래머스] 1154539 : Lv2 뒤에 있는 큰 수 찾기| 스택
상단으로

티스토리툴바