์ค๋๋ง์ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด๋ฅผ ๋ค์ ๋ธ๋ก๊ทธ์ ์ฌ๋ฆฌ๊ฒ ๋ ์ด์ ๊ฐ ๋๊ฐ์ง ์๋ค.
์ฒซ๋ฒ์งธ๋ก, ๋ฌธ์ ํ๊ณ ๋ ๋์ ์ฝ๋๋ฅผ ์ฐพ์๋ณด๊ฑฐ๋ ๊ณ ๋ฏผํ๋ ์๊ฐ์ด ๋ถ์กฑํ ๊ฒ ๊ฐ์์์ด๋ค.
๊ณจ๋ ๋ฌธ์ ๋ก ์ฌ๋ผ์ค๋๊น ํ ๋ฌธ์ ํ์ด์๋ ์ค๋ ๊ฑธ๋ ค์, ๋ฌธ์ ๋ฅผ ํ๊ณ ๋ ๋ค์ ์๊ฐ์ ๋ง์ด ์๋ค์ด๊ฒ ๋์๋ค.
๊ทธ๋ฌ๋ค๋ณด๋ ๋ฌธ์ ํ์ด ๋ฐฉ์๋ ํ์ ์ ์ด๊ณ ๋ ํฐ์ด ๋์์ง๋ฉด ๋ชป ํธ๋ ๋ฌธ์ ๊ฐ ๋๋ฌด ๋ง์์ง ๊ฒ ๊ฐ์๋ค.
์ฌ๋ฌ ๋ฐฉ์์ ๋ฌธ์ ํ์ด๋ฅผ ์งํํ๊ณ ๋ธ๋ก๊ทธ์ ์ฌ๋ฆฌ๋ฉด ๋๋ ์ ๋๋ก ์ดํดํ๊ณ ๋์ด๊ฐ ๊ฒ ๊ฐ๋ค๋ ๊ฒ ์ฒซ๋ฒ์งธ ์ด์ ๋ค.
๋๋ฒ์งธ๋ก, ๋ณ์๋ช ์ ์ข ๋ ์ ๊ฒฝ ์ฐ๊ณ ์ถ์ด์ก๋ค.
๋ถํธ์บ ํ ๋ค๋๋ฉด์ ๋ฌธ์ ํ ๋๋ ๊ทธ๋ ๊ณ ํ๋ก์ ํธ ํ ๋๋ ์ฌ์ค ๋ณ์๋ช ์ ํฌ๊ฒ ์ ๊ฒฝ์ ์์ผ๋ ๊ฒ ๊ฐ๋ค.
ํ๋ฒ ํ๊ณ ๋ง ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ ํนํ.
๊ทธ๋ฆฌ๊ณ ๋ณ์๋ช ์ด ๊ธธ๋ฉด ์๋๋ค๋ ๊ฐ๋ฐ๊ฐ์ ๊ฒ ์์๋๋ฐ, ๋ฉฐ์น ์ ๋ณ์๋ช ๋ช ์ ๋ํด ์ฐพ์๋ณด๋ค๊ฐ 10 ~ 16์ ์ฌ์ด ๋ณ์๋ช ์ด ๋๋ฒ๊น ํ๊ธฐ ๊ฐ์ฅ ์ข๋ค๋ ๋ด์ฉ์ ๋ณด๊ณ ๋ณ์๋ช ์ ๋ ์ง๊ด์ ์ผ๋ก ์ง๋ ์ฐ์ต์ ํ๋ ค๊ณ ํ๋ค.
์ด๋ฐ ์ด์ ์์ ํ๋ฃจ ํ ๋ฌธ์ ์ฉ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด๋ฅผ ์ฌ๋ ค๋ณด๋ ค๊ณ ํ๋ค.
๐ ๋ฌธ์ ์ค๋ช
2์ฐจ์ ์ธ๊ณ์ ๋ธ๋ก์ด ์์ฌ์๋ค. ๋น๊ฐ ์ค๋ฉด ๋ธ๋ก ์ฌ์ด์ ๋น๋ฌผ์ด ๊ณ ์ธ๋ค.
๋น๋ ์ถฉ๋ถํ ๋ง์ด ์จ๋ค. ๊ณ ์ด๋ ๋น๋ฌผ์ ์ด๋์ ์ผ๋ง์ผ๊น?
๐ ์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์๋ 2์ฐจ์ ์ธ๊ณ์ ์ธ๋ก ๊ธธ์ด H๊ณผ 2์ฐจ์ ์ธ๊ณ์ ๊ฐ๋ก ๊ธธ์ด W๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ H, W ≤ 500)
๋ ๋ฒ์งธ ์ค์๋ ๋ธ๋ก์ด ์์ธ ๋์ด๋ฅผ ์๋ฏธํ๋ 0์ด์ H์ดํ์ ์ ์๊ฐ 2์ฐจ์ ์ธ๊ณ์ ๋งจ ์ผ์ชฝ ์์น๋ถํฐ ์ฐจ๋ก๋๋ก W๊ฐ ์ฃผ์ด์ง๋ค.
๋ฐ๋ผ์ ๋ธ๋ก ๋ด๋ถ์ ๋น ๊ณต๊ฐ์ด ์๊ธธ ์ ์๋ค. ๋ 2์ฐจ์ ์ธ๊ณ์ ๋ฐ๋ฅ์ ํญ์ ๋งํ์๋ค๊ณ ๊ฐ์ ํ์ฌ๋ ์ข๋ค.
๐ ์ถ๋ ฅ
2์ฐจ์ ์ธ๊ณ์์๋ ํ ์นธ์ ์ฉ๋์ 1์ด๋ค. ๊ณ ์ด๋ ๋น๋ฌผ์ ์ด๋์ ์ถ๋ ฅํ์ฌ๋ผ.
๋น๋ฌผ์ด ์ ํ ๊ณ ์ด์ง ์์ ๊ฒฝ์ฐ 0์ ์ถ๋ ฅํ์ฌ๋ผ.
โค๏ธ ๋ฌธ์ ํ์ด ๋ฐฉ๋ฒ
ํญ์ ๋ฌธ์ ๋ค์ ์์ ํ์์ผ๋ก ํธ๋ ์ต๊ด์ด ๋ ๋์ก๋ค....
๊ทผ๋ฐ H, W๊ฐ 500์ดํ๋ผ์ ์๊ฐ๋ณต์ก๋์๋ ์ํฐ์ก๋ค.
๊ทธ๋๋ ์์ผ๋ก๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๊ณ ๋ ์ข์ ๋ฐฉ์์ ํ๊ตฌํด๋ณด๊ณ ์ถ์ด์ ธ์ ์๊ณ ๋ฆฌ์ฆ ํ์ด๋ฒ์ ์ ๊ธฐ๋ก ํ๋ค.
1๏ธโฃ ๋ธ๋ฃจํธํฌ์ค (์์ ํ์)
๊ฐ์ฅ ๋จผ์ , ์ง๊ด์ ์ผ๋ก ์ต๋ height๋ฅผ ๊ธฐ์ค์ผ๋ก height๋ฅผ 1์ฉ ์ค์ฌ๊ฐ๋ฉด์ ๋์ด๋ฅผ ๊ตฌํ๋ฉด ๋๊ฒ ๋ค๊ณ ์๊ฐํ๋ค.
์๊ฐ๋ณต์ก๋๋, ๋ฌธ์ ์กฐ๊ฑด์ธ ๋์ด์ ๋๋น๊ฐ 500์ดํ๋ผ์ O(H * W)์ด๋ค.
const fs = require("fs");
// TODO: ์ ์ถ ์ ๊ฒฝ๋ก ๋ณํ ํ์ ("/dev/stdin")
const input = fs.readFileSync("test.txt", "utf8").toString().trim().split("\n");
function solution(input) {
const [worldHeight, worldWidth] = input[0].split(" ").map(Number);
let areaSum = 0;
let maxHeight = -1;
const blockHeightArray = input[1].split(" ").map((str) => {
num = Number(str);
maxHeight = Math.max(maxHeight, num);
return num;
});
// ์ต๋ ๋์ด๊ฐ 0์ผ ๋๊น์ง ํ์ธต์ฉ ๊ณ์ฐ
while (maxHeight !== 0) {
// maxHeight๋ก ์์ํ๋ startIndex
let startIndex = -1;
// ๋ธ๋ก์ ๋์ด๊ฐ ์ ์ฅ๋ ๋ฐฐ์ด ์ํ
for (
let blockIndex = 0;
blockIndex < blockHeightArray.length;
blockIndex++
) {
// ์ต๋ ๋์ด๋ณด๋ค ํ์ฌ ๋ธ๋ก์ ๋์ด๊ฐ ๊ฐ๊ฑฐ๋ ๋ ๋์ ๊ฒฝ์ฐ
if (maxHeight <= blockHeightArray[blockIndex]) {
if (startIndex === -1) {
startIndex = blockIndex;
continue;
}
areaSum += blockIndex - startIndex - 1;
startIndex = blockIndex;
}
}
maxHeight--;
}
return areaSum;
}
console.log(solution(input));
2๏ธโฃ ํฌํฌ์ธํฐ
์ฒซ๋ฒ์งธ ๋ฐฉ๋ฒ์ผ๋ก ๋ฌธ์ ํ์ด ํ, ์๊ฐ ๋ณต์ก๋๋ฅผ ๋ ์ค์ผ ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํด๋ดค๋ค.
์ธ์ ๋ฐฐ์ด๋ผ๋ฆฌ ๋น๊ตํ๋ ๊ฒ๋ง ์๊ฐํ๋๊น ๋ฑํ ๋ฐฉ๋ฒ์ด ๋ ์ค๋ฅด์ง ์์์ ๋ง์ ์ฌ๋๋ค์ ์ฝ๋๋ฅผ ์ดํด๋ดค๋ค.
ํฌํฌ์ธํฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋๊ฑธ ์๊ฐ ๋ชปํ๋๊ฒ ์กฐ๊ธ ์์ฌ์ ๋ค.
ํฌํฌ์ธํฐ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ํ์ดํ๋ ๋ฐฉ๋ฒ์ ์ ๋์ ๋น๊ตํด์ ๋ ์ค ๋์ด๊ฐ ๋ ๋ฎ์ ๋ธ๋ก์ ๊ธฐ์ค์ผ๋ก, ์ฌ์ด๊ฐ๋ค์ ๋น๊ตํด ๋๊ฐ๋ ๋ฐฉ์์ด๋ค.
๋ก์ง์ ์์ธํ ์ ์ด๋ณด๋ฉด
1) ์ผ์ชฝ์ ๋์ด๊ฐ ๋ ๋ฎ์ผ๋ฉด
2) ์ง๊ธ๊น์ง์ ๋์ด๋ค๋ณด๋ค ๋์์ง ํ๋จํ๊ณ , ๋ง๋ค๋ฉด ๊ฐฑ์ ํ๋ค
3) ์ง๊ธ๊น์ง์ ๋์ด๋ค ์ค ๊ฐ์ฅ ๋์ง ์๋ค๋ฉด, ๋ค์ด๊ฐ ๋ถ๋ถ์ด๋๊น ๋น๋ฌผ์ด ๊ณ ์ผ ์ ์์ผ๋ฏ๋ก ์ต์ข ๋์ด์ ๋ํด์ค๋ค
4) ํฌ์ธํฐ๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ๋ค
const fs = require("fs");
// TODO: ์ ์ถ ์ ๊ฒฝ๋ก ๋ณํ ํ์ ("/dev/stdin")
const input = fs.readFileSync("test.txt", "utf8").toString().trim().split("\n");
function solution(input) {
const [worldHeight, worldWidth] = input[0].split(" ").map(Number);
const blockHeight = input[1].split(" ").map(Number);
let areaSum = 0;
let [left, right] = [0, worldWidth - 1];
let [maxLeftHeight, maxRightHeight] = [0, 0];
// ์ผ์ชฝ ์ธ๋ฑ์ค๋ณด๋ค ์ค๋ฅธ์ชฝ ์ธ๋ฑ์ค๊ฐ ๋ ํด ๋ ๋ฐ๋ณต
while (left < right) {
// ์ผ์ชฝ ํฌ์ธํฐ์ ๋์ด๋ณด๋ค ์ค๋ฅธ์ชฝ ํฌ์ธํฐ ๋์ด๊ฐ ๋ ํฐ ๊ฒฝ์ฐ
if (blockHeight[left] < blockHeight[right]) {
// ์ผ์ชฝ์ ๊ฐ๋ค ์ค ๊ฐ์ฅ ํฐ ๊ฐ๊ณผ ๋น๊ต
if (maxLeftHeight <= blockHeight[left]) {
maxLeftHeight = blockHeight[left];
} else {
// ๋ค์ด๊ฐ๋งํผ ๋ํด์ค๋ค
areaSum += maxLeftHeight - blockHeight[left];
}
left++;
} else {
if (maxRightHeight <= blockHeight[right]) {
maxRightHeight = blockHeight[right];
} else {
areaSum += maxRightHeight - blockHeight[right];
}
right--;
}
}
return areaSum;
}
console.log(solution(input));
๋ฌธ์ ํ์ด์์ ๋ ๊ฐ์ ํ ๋ถ๋ถ์ด ์๊ฑฐ๋, ์ข์ ๋ณ์๋ช ์ด ์์ผ๋ฉด ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
'๐ algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] ์ต์๋น์ฉ ๊ตฌํ๊ธฐ (0) | 2025.02.13 |
---|---|
[๋ฐฑ์ค] Z - JavaScript ๋ฌธ์ ํ์ด (0) | 2025.02.12 |
[์๊ณ ๋ฆฌ์ฆ] ๋ฐฑ์ค 2447 ๋ณ์ฐ๊ธฐ - 10 JAVA ๋ฌธ์ ํ์ด (2) | 2024.03.24 |
[Algorithm] ๋ณํฉ์ ๋ ฌ์ ๋ํด ์์๋ณด์ !! ๐ (0) | 2024.03.21 |
[๋ฐฑ์ค] 15649 N๊ณผ M (2) Java ๋ฌธ์ ํ์ด (0) | 2024.02.10 |