본문 바로가기
알고리즘/백준

[10026] 적록색약 javascript

by SeungYn 2023. 4. 1.

https://www.acmicpc.net/problem/10026

 

10026번: 적록색약

적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록)

www.acmicpc.net

 

나는 같은 색이면 dfs를 수행하고 적록색이면 한 번 더 dfs를 수행하는 방식으로 풀었다.

 

 

코드

const fs = require('fs');
const PATH =
  process.platform === 'linux' ? '/dev/stdin' : './baekjon/input.txt';

const input = fs.readFileSync(PATH).toString().trim().split('\n');
let [n, ...map] = input;
let colorCnt = 0;
let colorWeakness = 0;
let visited = Array.from({ length: n }, () => new Array(n).fill(false));

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

for (let i = 0; i < +n; i++) {
  for (let j = 0; j < +n; j++) {
    if (!visited[i][j]) {
      dfs(i, j, map[i][j]);
      colorCnt++;
    }
  }
}

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

for (let i = 0; i < n; i++) {
  for (let j = 0; j < n; j++) {
    if (!visited[i][j]) {
      dfs(i, j, map[i][j], true);
      colorWeakness++;
    }
  }
}

console.log(colorCnt, colorWeakness);

function dfs(x, y, color, isWeakNess = false) {
  if (visited[x][y]) return;
  visited[x][y] = true;
  for (let i = 0; i < 4; i++) {
    const nx = x + dx[i];
    const ny = y + dy[i];
    if (nx < 0 || nx >= n || ny < 0 || ny >= n) continue;
    if (color === map[nx][ny]) {
      dfs(nx, ny, color, isWeakNess);
    }
    if (
      isWeakNess &&
      (color === 'R' || color === 'G') &&
      (map[nx][ny] === 'R' || map[nx][ny] === 'G')
    ) {
      dfs(nx, ny, color, isWeakNess);
    }
  }
}

 

하지만 답지에서는 좀더 깔끔하게 했는데 그냥 적색일 때는 G 문자를 R로 바꿔줬다.

 

코드

const fs = require('fs');
const PATH =
  process.platform === 'linux' ? '/dev/stdin' : './baekjon/input.txt';

const input = fs.readFileSync(PATH).toString().trim().split('\n');
let [n, ...map] = input;
let colorCnt = 0;
let colorWeakness = 0;
let visited = Array.from({ length: n }, () => new Array(n).fill(false));

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

for (let i = 0; i < +n; i++) {
  for (let j = 0; j < +n; j++) {
    if (!visited[i][j]) {
      dfs(i, j, map[i][j]);
      colorCnt++;
    }
  }
}

visited = Array.from({ length: n }, () => new Array(n).fill(false));
map = map.map((str) => str.replace(/G/g, 'R'));

for (let i = 0; i < n; i++) {
  for (let j = 0; j < n; j++) {
    if (!visited[i][j]) {
      dfs(i, j, map[i][j]);
      colorWeakness++;
    }
  }
}

console.log(colorCnt, colorWeakness);

function dfs(x, y, color) {
  if (visited[x][y]) return;
  visited[x][y] = true;
  for (let i = 0; i < 4; i++) {
    const nx = x + dx[i];
    const ny = y + dy[i];
    if (nx < 0 || nx >= n || ny < 0 || ny >= n) continue;
    if (color === map[nx][ny]) {
      dfs(nx, ny, color);
    }
  }
}

'알고리즘 > 백준' 카테고리의 다른 글

[11509] 풍선 맞추기 Javascript  (0) 2023.04.13
[14502] 연구소 Javascript  (0) 2023.04.01