[Study] 구름톤 챌린지 구름 찾기 깃발 - JavaScript

박하민·2023년 8월 22일

오늘 문제가 어제 문제보다는 완전 탐색을 사용했다는 느낌을 받을 수 있게 해주는 문제였던 것 같습니다. 예전에 DFS를 사용해서 풀었던 문제와 비슷했던 맥락이 있었던 것 같아서 그때의 풀이법을 기억해서 풀어봤습니다.

구름톤 챌린지


오늘의 문제는 구름 찾기 깃발 입니다 !
주변에 1의 개수를 저장하고 K의 개수와 동일할 때의 개수를 세주는 것이 문제의 포인트인 것 같습니다. 주변에 1을 어떻게 체크할지 잘 생각해 봐야 할 것 같습니다.

풀이

const readline = require('readline');
let rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let count = 0;
let answer = 0;
let N, K;
const M = [];
const dx = [-1, -1, -1, 0, 0, 1, 1, 1];
const dy = [-1, 0, 1, -1, 1, -1, 0, 1];

rl.on('line', (line) => {
  count++;

  if (count === 1) {
    [N, K] = line.split(' ').map(Number);
  } else {
    M.push(line.split(' ').map(Number));
  }
});

rl.on('close', () => {
  function solution(x, y) {
    let cnt = 0;

    for (let k = 0; k < 8; k++) {
      let nx = x + dx[k];
      let ny = y + dy[k];

      if (nx >= 0 && nx < N && ny >= 0 && ny < N && M[nx][ny] === 1) {
        cnt += 1;
      }
    }
    return cnt;
  }

  for (let i = 0; i < N; i++) {
    for (let j = 0; j < N; j++) {
      if (M[i][j] === 0 && solution(i, j) === K) {
        answer += 1;
      }
    }
  }

  console.log(answer);
});
  1. 0,0 -> 0,1과 같이 좌표가 이동될 때 주변에 1을 탐색할 함수 solution을 만들어줬습니다. 이 함수는 현재 좌표의 값이 0이고 주변 1의 개수가 K와 동일하면 answer 개수를 올려줍니다.

  2. solution 함수가 호출되면 nx와 ny의 값이 변하며 8방위를 탐색합니다. 배열 M의 범위밖에 나가지 않고 8방위의 값 중 1이 존재한다면 1의 개수를 세는 cnt를 증가시키고 반복문이 끝나면 cnt를 return 합니다.
    ( return 값 cnt가 K와 같다면 맨 처음 설정한 answer 개수가 올라가게 됩니다. )


후기

개인적으로는 어제 문제보다 더 쉬웠던 것 같습니다. 완전 탐색을 사용하는 문제인 만큼 모든 좌표를 돌며 탐색하게 되어 N의 값이 너무 커지면 사용할 수 없지만 현재 N의 범위로는 완전 탐색이 가능하다고 판단해서 사용하게 되었습니다. 탐색의 종류도 다양하게 존재하기 때문에 문제를 잘 읽고 어떤 탐색 알고리즘을 사용할지 파악하는 능력을 더 키워야 할 것 같습니다.

profile
https://mintmin.dev/ <~~ 블로그 이전했씁니다

0개의 댓글