알고리즘 풀기,,!

Hwang Tae Young·2023년 4월 22일
0

뜬금없는 알고리즘 풀이!
전에 쓰던 react-hook-form은 일단 잠정 보류를 하겠습니다...

🤔지뢰 탐지가 필요해!

windows에서 지원하는 지뢰 찾기 게임을 한번쯤은 해 보았을 것이다.
특히 르탄이는 지뢰찾기의 매니아로 알려져 있다. 지뢰 찾기 map은 N*N의 정사각형 모양으로 각 칸에는 숫자가 들어가 있거나 지뢰가 들어가 있다. 빈 칸에는 숫자 0이 들어있다고 생각하자.

map의 어떤 칸에 적혀 있는 숫자는, 그 칸과 인접해 있는 여덟 개의 칸 중에서 지뢰가 들어 있는 칸이 몇 개인지를 나타내 준다. 물론 인접한 칸이 map 내부에 있는 경우에 대해서만 생각하면 된다. 예제를 보면 더 잘 이해할 수 있을 것이다.

이번 문제는 조금 업그레이드 된 지뢰 찾기로, 한 칸에 한 개의 지뢰가 있는 것이 아니고, 한 칸에 여러 개(1 이상 9 이하)의 지뢰가 묻혀 있는 게임이다. 따라서 map의 어떤 칸에 적혀 있는 숫자는, 그 칸과 인접해 있는 여덟 개의 칸들에 들어 있는 지뢰의 총 개수가 된다.

이미 windows 지뢰찾기 같은 것을 마스터한 르탄이는, map에서 지뢰에 대한 정보만이 주어졌을 때, 르탄이는 map을 완성하고 싶다고 한다. N과 지뢰의 위치가 주어졌을 때, 르탄이를 도와서 지뢰 찾기 map을 완성하는 프로그램을 작성하시오.

(단, 1 ≤ N ≤ 1,000 이며, 배열의 각 요소에는 지뢰 찾기 map에 대한 정보가 주어지는데 '.' 또는 숫자로 이루어진 문자열이 들어온다. '.'는 지뢰가 없는 것이고 숫자는 지뢰가 있는 경우로 그 칸의 지뢰의 개수이다. 한 줄은 N개의 문자로 이루어져 있다.)

N개의 줄에 걸쳐서 완성된 지뢰 찾기 map을 출력한다. 지뢰는 ''로 출력하며. 10 이상인 경우는 'M'(Many)으로 출력하면 된다. map은 숫자 또는 'M' 또는 ''로만 이루어져 있어야 한다.

입력
let N = 5;
let arr1 = [
["1", ".", ".", ".", "."],
[".", ".", "3", ".", "."],
[".", ".", ".", ".", "."],
[".", "4", ".", ".", "."],
[".", ".", ".", "9", "."],
];

출력
[[*, 4, 3, 3, 0],
[1, 4, *, 3, 0],
[4, 7, 7, 3, 0],
[4, *, M. 9, 9],
[4, 4, M, *, 9]]

문제 접근

  • 지뢰를 찾기 위해서는, 내 기준으로 각각 요소들을 비교해야한다.
  • 비교를 하기 위해서는 반복문을 사용할 것인데, 어떤 것을 사용할 것인가?
    • 배열 메서드 map
      - 반복문을 생각하면 for문도 있지만, 입력과 출력의 배열 요소가 같기 때문에, 사용한 배열과 결과의 형태가 같은 map을 사용.
  • 비교를 하기로 했다 이제 어떻게?
    • 요소를 기준으로 8방향을 찾아보도록 해야한다.
    • x축과 y축을 나눠야 하고, 요소 기준에서 8방향을 정해주어야 한다.
    • 그렇게 했을 경우는 배열의 양끝, 위아래 부분은 예외처리를 해줘야함 그렇게 했을 경우 if문으로 너무 많은 분기처리를 하게 되버린다...
  • 그럼 어떻게?
    • 8가지 방향을 전부 변수처리해서 진행한다,,!!!
      const [leftT = 0, leftC = 0, leftB = 0] = [
        boomAry[y - 1]?.[x - 1],
        boomAry[y]?.[x - 1],
        boomAry[y + 1]?.[x - 1],
      ];

      const [centerT = 0, centerB = 0] = [
        boomAry[y - 1]?.[x],
        boomAry[y + 1]?.[x],
      ];

      const [rightT = 0, rightC = 0, rightB = 0] = [
        boomAry[y - 1]?.[x + 1],
        boomAry[y]?.[x + 1],
        boomAry[y + 1]?.[x + 1],
      ];
  • 양끝에 있는 요소들은 undefined가 나오기 때문에 기본 값으로 0으로 설정
    (0으로 하는 이유는 지뢰의 숫자를 더하는 것이고, 아무것도 아닌경우는 더해도 이상없는 값이기 때문)

그리고 마지막으로 다 더해주고, 지뢰의 합이 10이 넘어가면 M을 아니라면 모든 지뢰의 합을 리턴해준다.

      const allBoom =
        leftT + leftC + leftB + centerT + centerB + rightT + 		rightC + rightB;
       return allBoom > 10 ? "M" : allBoom;

전체 코드

function solution(N, arr1) {
  const boomAry = arr1.map((item) =>
    item.map((num) => (num === "." ? Number(0) : Number(num))),
  );
  return boomAry.map((_, y) => {
    return _.map((item, x) => {
      if (item !== 0) {
        return "*";
      }

      const [leftT = 0, leftC = 0, leftB = 0] = [
        boomAry[y - 1]?.[x - 1],
        boomAry[y]?.[x - 1],
        boomAry[y + 1]?.[x - 1],
      ];

      const [centerT = 0, centerB = 0] = [
        boomAry[y - 1]?.[x],
        boomAry[y + 1]?.[x],
      ];

      const [rightT = 0, rightC = 0, rightB = 0] = [
        boomAry[y - 1]?.[x + 1],
        boomAry[y]?.[x + 1],
        boomAry[y + 1]?.[x + 1],
      ];

      const allBoom =
        leftT + leftC + leftB + centerT + centerB + rightT + rightC + rightB;

      return allBoom > 10 ? "M" : allBoom;
    });
  });
}
  • 처음에 값이 .이기 때문에 전부 0으로 치환해주었고, 배열의 요소가 0이 아닐경우는 지뢰이기 때문에 바로 *을 리턴해줌으로 예외처리를 했습니다! 끝!
profile
더 나은 개발자가 되기 위해...☆

0개의 댓글