Algorithm/Baekjoon
[JavaScript/node.js] ๋ฐฑ์ค 14943๋ฒ - ๋ฒผ๋ฃฉ ์์ฅ
๊ฐ๋ฐ๊ฐ๊ตด๐ธ
2022. 9. 19. 18:33
[๋ฌธ์ ]
https://www.acmicpc.net/problem/14943
[ํ์ด]
+๊ฐ์ ํ๋งค ๋ฐฐ์ด(sale[]), -๊ฐ์ ๊ตฌ๋งค ๋ฐฐ์ด(buy[])์ ๊ฐ๊ฐ ์ ์ฅํ ํ ํฌํฌ์ธํฐ๋ฅผ ํ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์์ต๋๋ค.
1. info[]์ ๋ด๊ฒจ์๋ ๋ฒผ๋ฃฉ ์์ฅ ์ ๋ณด๋ค์ sale๊ณผ buy์ [๊ธ์ก, index] ํํ๋ก ์ ์ฅํฉ๋๋ค.
2. ํ๋งค ์ ๋ณด์ ๊ตฌ๋งค ์ ๋ณด๋ก ํฌํฌ์ธํฐ๋ฅผ ์งํํฉ๋๋ค.
- buy์ ์์น๋ฅผ ์ ์ฅํ left ๋ณ์์, sale์ ์์น๋ฅผ ์ ์ฅํ right ๋ณ์๋ฅผ ๊ฐ๊ฐ 0์ผ๋ก ์ด๊ธฐํ ํฉ๋๋ค.
- buy์ left ๊ธ์ก๊ณผ sale์ right๊ธ์ก์ ๋น๊ตํ์ฌ ๋น์ฉ total๊ณผ left, right๋ฅผ ๊ฐฑ์ ํฉ๋๋ค.
- buy์ ๊ธ์ก๊ณผ sale์ ๊ธ์ก์ด ๊ฐ๋ค๋ฉด ํ๋งคํ๋ ๋ฒผ๋ฃฉ์ ๋ชจ๋ ๊ตฌ๋งคํ์์ผ๋ฏ๋ก left์ right๋ฅผ ๋ชจ๋ +1
=> ๋น์ฉ์ [left๊ฐ ๋ฐ๋ผ๋ณด๋ buy์ index - right๊ฐ ๋ฐ๋ผ๋ณด๋ sale์ index| * ๊ตฌ๋งค/ํ๋งค ๊ธ์ก - buy๊ธ์ก์ด ๋ ํฌ๋ค๋ฉด sale์ ๋ฒผ๋ฃฉ์ ๋ชจ๋ ํ๋งคํ๊ณ right++
=> ๋น์ฉ์ [left๊ฐ ๋ฐ๋ผ๋ณด๋ buy์ index - right๊ฐ ๋ฐ๋ผ๋ณด๋ sale์ index| * ํ๋งค ๊ธ์ก
=> buy ๊ธ์ก์์ sale์ด ํ๋งคํ ๊ธ์ก๋งํผ ๋นผ์ ๊ฐฑ์ - sale๊ธ์ก์ด ๋ ํฌ๋ค๋ฉด buy์ ๋ฒผ๋ฃฉ์ ๋ชจ๋ ๊ตฌ๋งคํ๊ณ left++
=> ๋น์ฉ์ [left๊ฐ ๋ฐ๋ผ๋ณด๋ buy์ index - right๊ฐ ๋ฐ๋ผ๋ณด๋ sale์ index| * ๊ตฌ๋งค ๊ธ์ก
=> sale ๊ธ์ก์์ buy๊ฐ ๊ตฌ๋งคํ ๊ธ์ก๋งํผ ๋นผ์ ๊ฐฑ์
- buy์ ๊ธ์ก๊ณผ sale์ ๊ธ์ก์ด ๊ฐ๋ค๋ฉด ํ๋งคํ๋ ๋ฒผ๋ฃฉ์ ๋ชจ๋ ๊ตฌ๋งคํ์์ผ๋ฏ๋ก left์ right๋ฅผ ๋ชจ๋ +1
๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ๊ณ์ฐํ๋ฉด ์ต์ ๋น์ฉ์ 950์ด ๋ฉ๋๋ค.
[์ฝ๋]
// ๋ฒผ๋ฃฉ ์์ฅ
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
const input = fs.readFileSync(filePath).toString().split('\n');
const [N] = input[0].split(" ").map(Number);
const info = input[1].split(" ").map(Number);
const buy = [];
const sale = [];
for(let i=0;i<info.length;i++) {
if(info[i] > 0) {
sale.push([info[i], i]);
} else {
buy.push([info[i], i]);
}
}
let left = 0;
let right = 0;
let total = 0;
while(left < buy.length && right < sale.length) {
const diff = Math.abs(buy[left][0] + sale[right][0]);
if(diff == 0) {
// ํ๋งค ๊ธ์ก === ๊ตฌ๋งค ๊ธ์ก
total += sale[right][0] * Math.abs(buy[left][1] - sale[right][1]);
left++;
right++;
} else if(buy[left][0] + sale[right][0] < 0) {
// ๊ตฌ๋งค ๊ธ์ก์ด ๋ ํผ
total += sale[right][0] * Math.abs(buy[left][1] - sale[right][1]);
buy[left][0] = diff*-1;
right++;
} else if(buy[left][0] + sale[right][0] > 0) {
// ํ๋งค ๊ธ์ก์ด ๋ ํผ
total += buy[left][0] * -1 * Math.abs(buy[left][1] - sale[right][1]);
sale[right][0] = diff;
left++;
}
}
console.log(total);