문제
https://school.programmers.co.kr/learn/courses/30/lessons/154539
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- 소요 시간 : 30분
- 난이도 : LV 2
나의 풀이
접근 방법
현재 위치보다 뒤에 있는 리스트를 돌면서 큰 수가 나오면 멈춘다.
시간복잡도
O(N^2)인데, 100만 * 100만이라 무조건 시간초과가 나온다..
코드
def solution(numbers):
answer = []
# 100만
for idx, n in enumerate(numbers):
backs = numbers[idx+1:]
back_bigger = -1
# 100만
for b in backs:
if b > n:
back_bigger = b
break
answer.append(back_bigger)
return answer
결과 : 시간초과
다른 사람 풀이
접근 방법
stack을 사용해 인덱스를 저장하고
numbers를 돌면서 현재 원소와 스택에 저장된 인덱스의 원소를 비교해 뒷큰수를 갱신해나가는 방식이다.
자세한 설명은 아래 블로그에 잘 나와있다.
[파이썬 PYTHON] 프로그래머스 【뒤에 있는 큰 수 찾기】
진짜 너무 어려웠다.. 문제를 겨우 이해해봤고 내가 이해한 바탕으로 예제를 통해 설명해보겠다. stack을 사용할 것이고, stack에는 값이 아닌 인덱스를 갱신해 나갈 것이다. 먼저 첫번째 원소(index
yinq.tistory.com
시간복잡도
for : O(N)
while : O(1) == 스택의 길이만큼 돌수 있어 O(N)이라고 착각되기 쉽다.
하지만 numbers의 모든 데이터는 1번만 push & pop할 수 있으므로 O(N) * O(1) = O(N)이다.
https://school.programmers.co.kr/questions/52564
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드
def solution(numbers):
n = len(numbers)
answer = [-1] * n
stack = []
for idx in range(n):
target = numbers[idx]
while stack and target > numbers[stack[-1]]:
answer[stack.pop()] = target
stack.append(idx)
return answer
결과 : 정답
정리
스택이라는 자료구조까진 접근할 수 있었는데
인덱스를 저장하는 것까지 생각하지 못했다.
다시 풀어보면 좋을듯한 문제 ~
'코딩테스트' 카테고리의 다른 글
[프로그래머스] 무인도 여행 - Python (1) | 2024.10.16 |
---|---|
[프로그래머스] 미로 탈출 명령어 - Python (1) | 2024.10.16 |
[프로그래머스] 귤 고르기 - Python (0) | 2024.10.15 |
[백준] 2343. 기타 레슨 - C++ (3) | 2024.10.04 |
[백준] 2792. 보석 상자 - C++ (0) | 2024.10.02 |