Lv3. 풍선터트리기 Javascript
https://programmers.co.kr/learn/courses/30/lessons/68646
// 최종 코드
function solution(a) {
if (a.length <= 3) return a.length;
let leftArr = [];
let rightArr = [];
let leftMin = a[0];
let rightMin = a[a.length - 1];
a.forEach((_, i) => {
if (a[i] < leftMin) {
leftMin = a[i];
}
leftArr.push(leftMin);
if (a[a.length - 1 - i] < rightMin) {
rightMin = a[a.length - 1 - i];
}
rightArr.push(rightMin);
});
rightArr.reverse();
let count = 0;
a.forEach((el, i) => {
if (el === leftArr[i] || el === rightArr[i]) count++;
});
return count;
}
function solution(a) {
// 3보다 작거나 같으면 모든 수가 마지막까지 남을 수 있음.
if (a.length <= 3) return a.length;
let leftArr = [];
let rightArr = [];
let leftMin = a[0];
let rightMin = a[a.length - 1];
a.forEach((_, i) => {
// i를 증가시키면서 left의 최소값을 체크
if (a[i] < leftMin) {
leftMin = a[i];
}
leftArr.push(leftMin);
// i를 증가시키면서 뒤에서부터 역순으로 right의 최소값을 체크
if (a[a.length - 1 - i] < rightMin) {
rightMin = a[a.length - 1 - i];
}
rightArr.push(rightMin);
});
// rightArr는 뒤에서 부터 돌았기 때문에 reverse 필요
rightArr.reverse();
let count = 0;
// 최소값Arr[i]와 현재 값(el)이 같으면 현재 값이 최소값이라는 의미
// 양쪽 모두에서 현재 값(el)이 최소값이거나 한쪽만이라도 최소값이면 조건에 만족.
a.forEach((el, i) => {
if (el === leftArr[i] || el === rightArr[i]) count++;
});
return count;
}
구현하기 전, 먼저 시간복잡도를 계산해보는 것이 중요.
O()을 O(n)으로 내리는 법을 강구하는 것이 쉽지는 않았다.
- 1차 시도 코드 : 시간 초과
function solution(arr) { let count = 0; for (let i = 0; i < arr.length; i++) { let leftFlag = 0; let rightFlag = 0; for (let left = 0; left < i; left++) { if (arr[left] < arr[i]) { leftFlag++; break; } } for (let right = i + 1; right < arr.length; right++) { if (arr[right] < arr[i]) { rightFlag++; break; } } if (leftFlag + rightFlag <= 1) { count++; } } return count; }
댓글 환영
질문 환영
by.protect-me