[프로그래머스] 레벨3 (level3) 풍선터트리기
2021년 03월 25일, 16:00
풍선 터트리기
문제풀이
풍선이 남아 있을 수 있으려면, 왼쪽 풍선과 오른쪽 풍선을 확인해서, 작은 풍선을 1번만 터트리는 경우를 찾아야한다.
그래서, 두 가지 배열을 만들어야한다. 배열의 인덱스가 현재 풍선 위치라고 가정하고,
- 왼쪽에서부터 현재 인덱스 전까지 남아있는 왼쪽 풍선은 무엇인지 저장하고 있는 배열을 만든다.
- 오른쪽에서부터 현재 인덱스 전까지 남아있는 오른쪽 풍선은 무엇인지 저장하고 있는 배열을 만든다.
- 그 다음 각 풍선을 돌면서, 왼쪽, 오른쪽의 풍선을 확인하여 현재 풍선이 터질 수 있는지 확인하면 된다.
예제 : [-16,27,65,-2,58,-92,-71,-68,-61,-33]인 경우 현재 지점에서 왼쪽 풍선이 어떠한 풍선이 남는지 배열을 만든다면(새로운 배열의 1번째 원소는 -16으로 시작) 1. -16 vs 27 -> [-16,-16,0,0,0,0,0,0,0,0] 2. -16 vs 65 -> [-16,-16,-16,0,0,0,0,0,0,0] ... 5. -16 vs -92 -> [-16,-16,-16,-16,-16,-92,0,0,0,0] ... 9. -92 vs -33 -> [-16,-16,-16,-16,-16,-92,-92,-92,-92,-92] 위와 같은 배열이 만들어진다. 그리고 이와 동일하게 오른쪽에 대해서도 똑같이 배열을 만들면 된다. left = [-16,-16,-16,-16,-16,-92,-92,-92,-92,-92] right = [-92,-92,-92,-92,-92,-92,-71,-68,-61,-33] 이렇게 두개의 배열을 만들고, [-16,27,65,-2,58,-92,-71,-68,-61,-33] 배열을 돌면서 확인해주면 된다.(첫번째, 마지막은 빼고 돌린다.) i=1인 27의 경우 left[0] , right[2]를 확인 i=2인 65의 경우 left[1] , right[3]을 확인 ...
- 첫번째, 마지막 풍선은 항상 터질 수 있다.
소스코드
const log = console.log;
function solution(a) {
let answer = 0;
let len = a.length;
let left = Array(len).fill(0);
let right = Array(len).fill(0);
left[0] = a[0];
right[len-1] = a[len-1];
for(let i=1 ; i<a.length ; i++){
if(a[i] > left[i-1]) left[i] = left[i-1];
else left[i] = a[i];
}
for(let i=len-2 ; i>=0 ; i--){
if(right[i+1] < a[i]) right[i] = right[i+1];
else right[i] = a[i];
}
for(let i=1 ; i<len-1 ; i++){
if(left[i-1] < a[i] && a[i] > right[i+1]) continue;
answer++;
}
answer+=2;
return answer;
}