JAVA/Coding Test
[JAVA] 프로그래머스 풍선터트리기_구현
오늘도개발
2024. 11. 4. 19:52
문제 : https://school.programmers.co.kr/learn/courses/30/lessons/68646
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
접근 :
- 풍선의 갯수가 1인 경우 = 1개만 가능
- 풍선의 갯수가 2 인 경우 = 1개를 제거 할 수 있으므로 2개 가능
- 풍선의 갯수가 3개 이상인 경우
1. 좌측 중간 우측 으로 나뉠 수 있음
2. 만약 첫 번째 풍선인 경우 우측의 최소값 1개를 제외하고 나머지는 모두 터트릴 수 있으므로 가능 ( 1개를 제거할 수 있으므로 )
3. 만약 마지막 풍선인 경우 좌측의 최소값 1개를 제외하고 나머지는 모두 터트릴 수 잇으므로 가능 ( 1개 제거 가능 )
4. 만약 중간의 풍선인 경우 좌측의 최소값과 우측의 최소값을 기준으로 비교한다.
4-1. 만약 중간의 풍선이 좌측과 우측의 최소값 보다 작은 경우 = 좌, 우측 풍선 중 1개를 터트리고 1개를 제거하므로 가능
4-2. 만약 중간 풍선이 좌측 또는 우측 최소 값보다 큰 경우 = 좌우측 중 자신보다 큰 풍선을 터트리고 1개를 제거 하므로 가능
4-3. 만약 중간 풍선이 좌 우측 최소값 보다 큰 경우 = 불가능
-> 해당 인덱스를 기준으로 좌측 과 우측의 최소값을 배열에 저장하여 체크한다.
코드 구현 :
class Solution {
public int solution(int[] a) {
if(a.length <= 2) return a.length;
int answer = 2;
int[] left = new int[a.length];
int[] right = new int[a.length];
int min = a[0];
for(int i = 1 ; i < a.length-1 ; i++){
left[i] = min;
min = Math.min(min, a[i]);
}
min = a[a.length-1];
for(int i = a.length-2 ; i > 0 ; i--){
right[i] = min;
min = Math.min(min, a[i]);
}
for(int i = 1; i < a.length-1 ; i++){
if(left[i] < a[i] && right[i] < a[i]) continue;
answer++;
}
return answer;
}
}