[백준] 16956 늑대와 양 JavaScript

·2024년 5월 13일

문제

크기가 R×C인 목장이 있고, 목장은 1×1 크기의 칸으로 나누어져 있다. 각각의 칸에는 비어있거나, 양 또는 늑대가 있다. 양은 이동하지 않고 위치를 지키고 있고, 늑대는 인접한 칸을 자유롭게 이동할 수 있다. 두 칸이 인접하다는 것은 두 칸이 변을 공유하는 경우이다.

목장에 울타리를 설치해 늑대가 양이 있는 칸으로 갈 수 없게 하려고 한다. 늑대는 울타리가 있는 칸으로는 이동할 수 없다. 울타리를 설치해보자.

입력

첫째 줄에 목장의 크기 R, C가 주어진다. 1 ≤ R, C ≤ 500

둘째 줄부터 R개의 줄에 목장의 상태가 주어진다. '.'는 빈 칸, 'S'는 양, 'W'는 늑대이다.

출력

늑대가 양이 있는 칸으로 갈 수 없게 할 수 있다면 첫째 줄에 1을 출력하고, 둘째 줄부터 R개의 줄에 목장의 상태를 출력한다. 울타리는 'D'로 출력한다. 울타리를 어떻게 설치해도 늑대가 양이 있는 칸으로 갈 수 있다면 첫째 줄에 0을 출력한다.

예제 입력

6 6
..S...
..S.W.
.S....
..W...
...W..
......

예제 출력

1
..SD..
..SDW.
.SD...
.DW...
DD.W..
......

내가 했던 풀이 방법

  1. isSafe를 true로 초기화해준 뒤, pasture(목장의 상태)를 검사한다.
  2. pasture[i][j]가 늑대(W)일 경우, 늑대 위치의 위/아래/양 옆을 울타리로 채워주면 된다. 만약, 위/아래/양 옆에 양(S)이 존재할 경우, 늑대가 어떻게 해도 양에게 갈 수 있으므로 isSafe를 false로 만들고 반복문들 탈출한다.
  3. 목장을 전부 검사한 뒤, isSafe가 true라면 1을 출력하고, pasture를 한 줄씩 출력한다. 만약, isSafe가 false라면 0을 출력한다.

코드

const fs = require('fs');
let [n, ...pasture] = fs.readFileSync(0, 'utf-8').toString().trim().split('\n');

let R = Number(n.trim().split(' ')[0]);
let C = Number(n.trim().split(' ')[1]);

for (let i = 0; i < R; i++) {
  pasture[i] = pasture[i].trim().split('');
}

let isSafe = true;
for (let i = 0; i < R; i++) {
  for (let j = 0; j < C; j++) {
    if (pasture[i][j] === 'W') {
      if (i !== 0) {
        if (pasture[i - 1][j] === '.') pasture[i - 1][j] = 'D';
        else if (pasture[i - 1][j] === 'S') {
          isSafe = false;
          break;
        }
      }
      if (i !== R - 1) {
        if (pasture[i + 1][j] === '.') pasture[i + 1][j] = 'D';
        else if (pasture[i + 1][j] === 'S') {
          isSafe = false;
          break;
        }
      }
      if (j !== 0) {
        if (pasture[i][j - 1] === '.') pasture[i][j - 1] = 'D';
        else if (pasture[i][j - 1] === 'S') {
          isSafe = false;
          break;
        }
      }
      if (j !== C - 1) {
        if (pasture[i][j + 1] === '.') pasture[i][j + 1] = 'D';
        else if (pasture[i][j + 1] === 'S') {
          isSafe = false;
          break;
        }
      }
    }
  }
  if (!isSafe) {
    break;
  }
}

let answer = '';
if (isSafe) {
  console.log(1);
  for (let i = 0; i < R; i++) {
    answer += pasture[i].toString().replaceAll(',', '') + '\n';
  }
  console.log(answer.trim());
} else {
  console.log(0);
}

회고

문제가 어려운 건 아니고 풀이 방법도 다양한데 늑대를 막는 방법을 택했다. 물론 늑대와 양이 붙어있지만 않으면 모든 빈 칸이 울타리로 바뀌면 되긴 하지만, 그래도 전부 울타리로 바꾸는 코드는 짜고 싶지 않았기에.. 아무리 애드 혹 문제라지만.. 그렇게 풀이하고 싶진 않아서 늑대를 막아주는 방법으로 풀이했다.

profile
Frontend🍓

0개의 댓글