[프로그래머스] 뒤에 있는 큰 수 찾기 - 파이썬

Donghyun·2024년 9월 6일
0

Code Kata - 파이썬

목록 보기
53/54
post-thumbnail

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

문제 설명

정수로 이루어진 배열 numbers가 있습니다. 배열 의 각 원소들에 대해 자신보다 뒤에 있는 숫자 중에서 자신보다 크면서 가장 가까이 있는 수를 뒷 큰수라고 합니다.

정수 배열 numbers가 매개변수로 주어질 때, 모든 원소에 대한 뒷 큰수들을 차례로 담은 배열을 return 하도록 solution 함수를 완성해주세요. 단, 뒷 큰수가 존재하지 않는 원소는 -1을 담습니다.


제한사항

  • 4 ≤ numbers의 길이 ≤ 1,000,000
    • 1 ≤ numbers[i] ≤ 1,000,000

입출력 예

numbersresult
[2, 3, 3, 5][3, 5, 5, -1]
[9, 1, 5, 3, 6, 2][-1, 5, 6, 6, -1, -1]

입출력 예 설명

입출력 예 #1

2의 뒷 큰수는 3입니다. 첫 번째 3의 뒷 큰수는 5입니다. 두 번째 3 또한 마찬가지입니다. 5는 뒷 큰수가 없으므로 -1입니다. 위 수들을 차례대로 배열에 담으면 [3, 5, 5, -1]이 됩니다.

입출력 예 #2

9는 뒷 큰수가 없으므로 -1입니다. 1의 뒷 큰수는 5이며, 5와 3의 뒷 큰수는 6입니다. 6과 2는 뒷 큰수가 없으므로 -1입니다. 위 수들을 차례대로 배열에 담으면 [-1, 5, 6, 6, -1, -1]이 됩니다.


문제풀이

목표: numbers의 각 원소별로 자신보다 크면서 가장 가까운 숫자를 찾아 배열에 담아 return

내 풀이

스택을 사용

  • answer = [-1] * len(numbers)에서 처음에 모두 -1로 채움. 기본적으로 뒷 큰수가 없다고 가정한 상태.
  • 만약 뒷 큰수를 찾으면 answer[idx] = numbers[i]로 그 자리에 뒷 큰수를 넣는다.
  • 뒷 큰수를 찾지 못한 인덱스들은 answer 리스트에서 -1인 상태로 남아있는다.

최종코드

def solution(numbers):
    answer = [-1] * len(numbers)
    
    # 스택은 인덱스를 저장
    stack = []
    for i in range(len(numbers)):
        # 스택에 값이 있고, 현재 숫자가 스택에 있는 숫자보다 큰 동안 반복
        while stack and numbers[stack[-1]] < numbers[i]:
            # 스택에서 값을 꺼내서 그 위치의 뒷 큰수로 현재 숫자를 설정
            idx = stack.pop()
            answer[idx] = numbers[i]
        
        # 현재 인덱스를 다음 숫자들과 비교하기 위해 스택에 넣는다
        stack.append(i)
        
    return answer
profile
데이터분석 공부 일기~!

0개의 댓글