백준 1303 JS 풀이

hun2__2·2023년 7월 22일
0

코딩테스트

목록 보기
14/48

구하는 값

연결요소별 w,b의 제곱값들의 합

핵심 아이디어

상하좌우 dfs를 돌면서 w, b각각 카운팅

구현방법

dfs파라미터

dfs에 파라미터로 cnt값을 넘겨주면서 return 받아 더하는 방법으로 구현

전역변수로

전역변수를 만들고 dfs돌때마다 w,s의 제곱수를 더해준 후 초기화해줌

코드

DFS 파라미터

const input = require('fs').readFileSync('dev/stdin').toString().trim().split('\n')

const [m, n] = input[0].split(" ").map(Number);

const graph = [];
for (let i = 1; i <= n; i++) graph.push(input[i].split(""));
// console.log(graph);

const visited = Array.from({ length: n }, () => new Array(m).fill(false));

const dy = [-1, 1, 0, 0],
    dx = [0, 0, -1, 1];

function dfs(y, x, team, cnt) {
    visited[y][x] = true;

    for (let i = 0; i < 4; i++) {
        const ny = y + dy[i],
            nx = x + dx[i];

        if (ny < 0 || ny >= n || nx < 0 || nx >= m) continue;

        if (!visited[ny][nx] && graph[ny][nx] === team) cnt = dfs(ny, nx, team, cnt + 1);
    }
    return cnt;
}
let ans1 = 0;
ans2 = 0;
for (let i = 0; i < n; i++) {
    for (let j = 0; j < m; j++) {
        if (visited[i][j]) continue;

        graph[i][j] === "W"
            ? (ans1 += dfs(i, j, "W", 1) ** 2)
            : (ans2 += dfs(i, j, "B", 1) ** 2);
    }
}

console.log(ans1, ans2);

DFS 전역변수

const input = require('fs').readFileSync('dev/stdin').toString().trim().split('\n')

const [m, n] = input[0].split(" ").map(Number);

const graph = [];
for (let i = 1; i <= n; i++) graph.push(input[i].split(""));
// console.log(graph);

const visited = Array.from({ length: n }, () => new Array(m).fill(false));

let w = 1,
    b = 1;

const dy = [-1, 1, 0, 0],
    dx = [0, 0, -1, 1];

function dfs(y, x, team) {
    visited[y][x] = true;

    for (let i = 0; i < 4; i++) {
        const ny = y + dy[i],
            nx = x + dx[i];

        if (ny < 0 || ny >= n || nx < 0 || nx >= m) continue;

        if (!visited[ny][nx] && graph[ny][nx] === team) {
            team === "W" ? w++ : b++;
            dfs(ny, nx, team);
        }
    }
}

let ans1 = 0,
    ans2 = 0;
for (let i = 0; i < n; i++) {
    for (let j = 0; j < m; j++) {
        if (visited[i][j]) continue;

        if (graph[i][j] === "W") {
            dfs(i, j, "W");
            ans1 += w ** 2;
            w = 1;
        } else {
            dfs(i, j, "B");
            ans2 += b ** 2;
            b = 1;
        }
    }
}

console.log(ans1, ans2);

시간은 또이또이 근데 파라미터가 더 좋아보임(초기화 과정이 없고, 코드가 간결하며 깔끔함)

profile
과정을 적는 곳

0개의 댓글