문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/68646
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 풀이
- 규칙에 따라 최종적으로 남을 수 있는 1개의 풍선은 몇 개 가능한 지 출력하는 문제
- 인접한 두 풍선을 고른 뒤, 하나를 터트림
- 번호가 작은 풍선을 1번만 터트리기 가능
- 이후에는 큰 풍선만 터트림
- cur 기준으로 왼쪽에서의 최솟값과 오른쪽에서의 최솟값을 구함
- 배열의 길이가 1백만이므로 n^2으로 구할 시 시간 초과가 뜸
- 오른쪽에서의 최솟값은 반대 방향으로 일직선 탐색
- cur 기준 구한 양쪽의 최솟값을 통해
- 왼쪽 최솟값이 cur보다 크다면 그냥 성공 ( 오른쪽에서 어떤 값이 나오더라도 1번만 터트릴 수 있으니까)
- 왼쪽 최솟값이 cur보다 작다면 cur이 살아남기 위해서는 오른쪽 최솟값보다는 작아야함 ( 왼쪽에서 이미 작은 거 터트릴 기회 1번 썼으니까)
- 오른쪽 최솟값이 cur 보다 크다면 answer 는 + 1 ( 크니까 자동으로 터트릴 수 있어서 cur은 살아남음)
- 오른쪽 최솟값이 cur보다 작다면 continue
소스 코드
def solution(a):
answer = 2 # a[0]과 a[-1] 은 어떠 한 경우라도 살아남기 가능함
n = len(a)
min_arr = [0]*n #오른쪽 최솟값
min_arr[0]=a[0]
min_arr[-1]=a[-1]
arr = [a[0]]*n #왼쪽 최솟값
for i in range(-2,-n,-1):
if a[i]>min_arr[i+1]:
min_arr[i]=min_arr[i+1]
else:
min_arr[i]=a[i]
for i in range(1,n):
if a[i] < arr[i-1]:
arr[i]=a[i]
else:
arr[i]=arr[i-1]
for i in range(1,n-1):
if a[i]<arr[i-1]:
answer+=1
else:
if a[i]>min_arr[i+1]:
continue
else:
answer+=1
return answer
print(solution([-16,27,65,-2,58,-92,-71,-68,-61,-33]))
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
[최단거리] 부대 복귀 (파이썬) (0) | 2023.05.06 |
---|---|
[링크드리스트] 표 편집 (파이썬) (0) | 2023.05.06 |
[데브 매칭] 다단계 칫솔 판매 ( 파이썬 ) (0) | 2023.04.26 |
[탐색] 자물쇠와 열쇠 (파이썬) (0) | 2023.04.25 |
[이분탐색] 입국심사 (파이썬) (0) | 2023.04.22 |