문제: https://school.programmers.co.kr/learn/courses/30/lessons/154539
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
사용 자료구조: 스택
사실 문제의 답을 내는 논리 자체는 너무 쉬워서 이게 왜 Lv. 2 ? 라고 생각했지만.. 23 개의 테스트케이스 중에 11번까지 통과되고 나머지는 시간초과가 떴다.
이중 for 문을 사용하기 때문에 시간 복잡도가 O(n^2) 이 되기 때문에 n 값이 커질수록 실행시간이 길어져 시간 초과가 발생한 것이다.
시간초과코드
def findLargerThenMe(cur, numList):
for i in range(len(numList)):
if cur < numList[i]:
return numList[i]
return -1
def solution(numbers):
answer = []
for i in range(len(numbers)-1):
if numbers[i] < numbers[i+1]:
answer.append(numbers[i+1])
else:
answer.append(findLargerThenMe(numbers[i], numbers[i + 1:]))
answer.append(-1)
return answer
이렇게 저렇게 코드를 코쳐봤지만, 도저히 모르겠어서 풀이를 보고 공부했다. (분하다 😭)
우선 이 문제를 풀려면 스택을 사용해야 한다.
스택: 데이터를 임시로 저장하는 자료구조로 자료를 차례대로 처리할 수 있도록 해줌
-> 스택을 사용하여 뒷큰수를 찾지 못한 숫자의 인덱스를 저장해 두고 numbers 배열을 돌면서 뒷큰수 찾기
1. answer 배열을 numbers 배열을 길이만큼 -1 로 초기화 -> 뒷큰수가 존재하지 않는 경우 계속 -1 로 남아있어야 하기 때문
2. numbers 배열을 돌면서 방문
3. 방문한 numbers 숫자와 numbers[스택 꼭대기 값=인덱스] 를 확인
- 방문한 numbers 값이 뒷큰수가 될 수 있다면 스택 꼭대기 값을 pop 시키고 answer 에 방문한 numbers 값 추가
- 방문한 numbers 값이 뒷큰수가 될 수 없다면 방문한 numbers 배열의 인덱스를 스택에 넣고 2번으로 돌아가서 반복
예시)
answer 배열을 numbers 배열의 길이만큼 -1 로 초기화하고 시작
가장 먼저 배열의 9를 방문, 스택에 9의 인덱스인 0을 넣음 (비교할 대상이 존재하지 않음)

1을 방문
스택의 꼭대기 값인 9와 1을 비교 -> 1은 9의 뒷큰수가 될 수 없음 -> 스택에 1의 인덱스 추가

5를 방문
스택의 꼭대기 값인 1과 5를 비교 -> 5는 1의 뒷큰수가 될 수 있음 -> 스택에서 1을 pop, answer 1번 인덱스 값을 5로 바꿈(뒷큰수 추가)
다시 스택의 꼭대기 값인 9와 5를 비교 -> 5는 9의 뒷큰수가 될 수 없음 -> 스택에 5의 인덱스 추가

3을 방문
스택의 꼭대기 값인 5와 비교 -> 3은 5의 뒷큰수가 될 수 없음 -> 스택에 5의 인덱스 추가

6을 방문
스택의 꼭대기 값인 3과 비교 -> 6은 3의 뒷큰수가 될 수 있음 -> 스택에서 3을 pop, answer 3번 인덱스 값을 6으로 바꿈(뒷큰수 추가)
스택의 꼭대기 값인 5와 비교 -> 6은 5의 뒷큰수가 될 수 있음 -> 스택에서 5를 pop, answer 2번 인덱스 값을 6으로 바꿈(뒷큰수 추가)
스택의 꼭대기 값인 9와 비교 -> 6은 9의 뒷큰수가 될 수 없음 -> 스택에 6의 인덱스 추가

마지막 수인 2는 뒤에 남는 수가 없기 때문에 무조건 -1의 값을 가지게 됨.
스택에 마지막까지 남아있던 6과 9 역시 뒷큰수가 없기 때문에 -1의 값을 가지게 됨.
전체코드
def solution(numbers):
answer = [-1]*len(numbers)
stack = []
for index in range(len(numbers)):
visit = numbers[index]
while stack and numbers[stack[-1]]<visit:
answer[stack.pop()]=visit
stack.append(index)
return answer
'프로그래머스' 카테고리의 다른 글
[프로그래머스/Python] Lv.2 피로도 (0) | 2024.08.20 |
---|---|
[프로그래머스/Python] 달리기 경주 (0) | 2024.08.13 |
[프로그래머스/python] 2022 KAKAO BLIND RECRUITMENT 주차 요금 계산 (1) | 2024.06.11 |
[프로그래머스/python] 2023 KAKAO BLIND RECRUITMENT개인정보 수집 유효기간 (0) | 2024.05.31 |
[프로그래머스/python] 2024 KAKAO WINTER INTERNSHIP가장 많이 받은 선물 (0) | 2024.05.28 |