[문제]
https://school.programmers.co.kr/learn/courses/30/lessons/68646
[풀이]
i번째 풍선이 존재하고, 그 양 옆으로 큰 풍선들을 터뜨려나가면 i번째 풍선 양 옆에는 왼쪽 최솟값을 가진 풍선과 오른쪽 최솟값을 가진 풍선이 남을 것이다.
번호가 더 작은 풍선을 터뜨릴 수 있는 기회는 딱 1번 존재하기 때문에, 만약 양 옆 풍선이 둘 다 i번째 풍선보다 더 작으면 i번째 풍선만 남기는 것이 불가능하다. 하나만 더 크거나 둘 다 크면 남기는 것이 가능하다.
맨 왼쪽 풍선과 오른쪽 풍선 같은 경우 한쪽 방향의 최솟값 풍선만이 남게 되고, 그 풍선이 더 작더라도 작은 풍선을 터뜨릴 수 있는 기회가 있기 때문에 해당 풍선만 남기는 것이 항상 가능하다.
따라서 answer=2로 설정해놓고, i번째 풍선에 대한 왼쪽 최솟값, 오른쪽 최솟값 풍선을 저장한 뒤 비교해서 구할 수 있다.
[코드]
class Solution {
public int solution(int[] a) {
int answer = 2; //맨 왼쪽, 오른쪽은 전부 가능
//풍선들을 1개만 남을 때까지 터트렸을 때 최후까지 남기는 것이 가능한 풍선들의 개수를 return
int[] left = new int[a.length];
int[] right = new int[a.length];
//i일 때 왼쪽 최솟값 저장
int min = a[0];
for(int i=1; i<a.length-1; i++){
left[i] = min;
if(a[i] < min){
min = a[i];
}
}
//i일 때 오른쪽 최솟값 저장
min = a[a.length-1];
for(int i=a.length-2; i>0; i--){
right[i] = min;
if(a[i] < min){
min = a[i];
}
}
//양 옆의 최솟값이 둘 다 i 보다 작으면 불가능.
for(int i=1; i<a.length-1; i++){
if(left[i] < a[i] && right[i] < a[i]) continue;
answer++;
}
return answer;
}
}
'알고리즘 공부 및 문제 풀이 > 프로그래머스(PRO)' 카테고리의 다른 글
[pro] 프로그래머스 level3 49191 순위 (Java) - 플로이드 와샬 (0) | 2023.01.12 |
---|---|
[pro] 프로그래머스 level3 60061 기둥과 보 설치 (Java) - 시뮬레이션 (1) | 2023.01.11 |
[pro] 프로그래머스 level3 64062 징검다리 건너기 (Java) - 이분탐색 (0) | 2022.12.15 |
[pro] 프로그래머스 level3 67259 경주로 건설 (Java) - BFS (0) | 2022.12.14 |
[pro] 프로그래머스 level3 67258 보석 쇼핑 (Java) - 투포인터 (1) | 2022.12.14 |