티스토리 뷰

문제: https://www.acmicpc.net/problem/16235

문제 풀이

  1. 나무 위치와 나이를 별도로 저장하지 않고, 주어지는 배열을 그대로 사용하자. trees[x, y ,z]
  2. 나이가 어린 나무부터 양분을 섭취하므로, trees 배열을 나이를 기준으로 오름차순 정렬한다.
  3. 반복문을 통해 K번 봄, 여름, 가을, 겨울을 거친다.
  4. 죽은 나무 deadTrees, 살아있는 나무 aliveTrees로 배열을 생성하여 한 해를 보낸다.
  5. trees 배열을 비우고, 가을에 새로 번식한 나무와 함께 살아있는 나무 aliveTreestrees 배열에 저장한다.
    (이때, 번식한 나무의 나이가 1이고 aliveTrees는 이미 오름차순 정렬되어 있으므로, 다시 정렬할 필요가 없다)

전체 코드

const fs = require("fs");
const [[n, m, k], ...data] = fs.readFileSync("/dev/stdin").toString().trim().split("\n")
    .map(line => line.split(" ").map(Number));
const A = data.slice(0, n);
let trees = data.slice(n);
const graph = Array.from(new Array(n), () => Array(n).fill(5)); // 현재 양분
const dr = [-1, -1, -1, 0, 1, 1, 1, 0];
const dc = [-1, 0, 1, 1, 1, 0, -1, -1];

// 나이 오름차순 정렬
trees.sort((a, b) => {
    return a[2] - b[2];
})

// K년 후
for (let i = 0; i < k; i++) {
    const aliveTrees = [];
    const deadTrees = [];
    
    /* 봄 */
    for (const [r, c, a] of trees) {
        // 죽은 나무
        if (graph[r-1][c-1] < a) {
            deadTrees.push([r, c, a]);
            continue;
        }
        // 나무 양분 섭취
        graph[r-1][c-1] -= a;
        aliveTrees.push([r, c, a+1]);
    }
    trees = []; // 기존 배열 비우기
    
    /* 여름 */
    for (const [r, c, a] of deadTrees) {
        graph[r-1][c-1] += Math.floor(a / 2); // 죽은 나무 양분 저장
    }
    
    /* 가을 */
    for (const [r, c, a] of aliveTrees) {
        if (a % 5 !== 0) continue; // 번식할 수 없는 나무
        
        for (let d = 0; d < 8; d++) {
            const nr = r + dr[d];
            const nc = c + dc[d];
            
            // 땅을 벗어나면 패스
            if (nr < 1 || nr > n || nc < 1 || nc > n) continue;
            trees.push([nr, nc, 1]); // 새 나무 번식
        }
    }
    trees.push(...aliveTrees); // 살아있는 나무 저장
    
    /* 겨울 */
    for (let r = 0; r < n; r++) {
        for (let c = 0; c < n; c++) {
            graph[r][c] += A[r][c]; // 양분 추가
        }
    }
}

console.log(trees.length);
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함