https://www.acmicpc.net/problem/1756
로직
구현문제
화덕의 깊이, 피자의 크기는 30만
- 피자가 들어올 때 마다 화덕을 탐색시 최대 30만 * 30만 = 900억번의 연산
화덕의 구조가 밑이 아무리 넓어도 위가 좁으면 그 크기를 이용 불가
- 그렇기에 현재 위치(해당 깊이)에 들어갈 수 있는 크기는 시작부터 현재까지의 최소값
한번 위에서 피자를 집어 넣게되면 밑은 사용이 불가능한 구조
화덕의 최소값의 변화를 기록하는 Array 생성(변수명 minArray)
화덕의 최소값을 몇칸 사용 가능한지 기록(변수명 cnt)
피자를 순회 돌며 지름과 minList의 마지막 값과 비교
마지막 값보다 피자가 크면 맞는 크기가 나올 떄 까지 minList의 뒷부분 제거
- 이번 피자를 넣을 수 있는 위치를 깊은곳부터 탐색
- 이번 피자를 넣게되면 그 보다 깊은 곳은 사용 불가하므로 pop
피자를 다 넣을 수 있다면, 현재 남아있는 minList의 값이 몇층있는지 계산
// 함수
function solution(D,N,oven,pizza){
const [minArray,cnt] = minCheck(oven)
for (const length of pizza){
while (minArray.length !== 0){
if (length > minArray[minArray.length-1]){
const num = minArray.pop();
delete cnt[num];
} else break;
}
if (minArray.length !== 0){
const ovenSize = minArray.at(-1);
cnt[ovenSize] -= 1
if (cnt[ovenSize]===0){
minArray.pop();
delete cnt[ovenSize];
}
} else return 0;
}
let answer = 1;
for (const size of minArray){
answer += cnt[size];
}
return answer;
}
function minCheck(arr){
const value = new Array();
const cnt = new Object();
let minValue = 1000000001
for (const num of arr){
if (num < minValue){
minValue = num
value.push(minValue)
cnt[minValue] = 1
} else cnt[minValue] += 1
}
return [value,cnt]
}
// 인풋
const fs = require('fs');
const URI = process.platform === 'linux'? 0:'./1756.txt';
const inputs = fs.readFileSync(URI,'utf-8').toString().trim().split('\n');
const pizza = inputs.pop().split(' ').map(Number);
const oven = inputs.pop().split(' ').map(Number);
const [D,N] = inputs.pop().split(' ').map(Number);
// 실행
const ans = solution(D,N,oven,pizza);
console.log(ans)
'알고리즘 문제 풀이 > Javascript' 카테고리의 다른 글
[node.js] 16507 어두운 건 무서워 (0) | 2025.01.14 |
---|---|
[node.js] 1331 나이트투어 with Python (0) | 2025.01.13 |
javascript(nodeJS) 백준 14719 빗물 (0) | 2024.05.28 |
Javascript[node.js] 백준 2174 로봇 시뮬레이션 (0) | 2024.05.27 |
Javascript [nodeJS] 백준 7682 틱택토 (0) | 2024.05.24 |