백준 감시 Node.js (재풀이예정)

버건디·2023년 6월 20일
0

백준

목록 보기
59/75

문제 링크

const input = `3 7
4 0 0 0 0 0 0
0 0 0 2 0 0 0
0 0 0 0 0 0 4`.split("\n");

let [N, M] = input
  .shift()
  .split(" ")
  .map((str) => Number(str));
let board = input.map((str) => str.split(" ").map((str) => Number(str)));

function solution(N, M, board) {
  let answer = 0;

  for (let i = 0; i < N; i++) {
    for (let j = 0; j < M; j++) {
      // 1번 카메라
      if (board[i][j] === 1) {
        let dir = {
          0: 0,
          1: 0,
          2: 0,
          3: 0,
        };
        let maxCount = 0;
        let count = 0;

        // 북쪽
        count = 0;
        let nx = i - 1;
        let ny = j;
        while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
          if (board[nx][ny] === 0) {
            count++;
          } else if (board[nx][ny] === 6) {
            break;
          }
          nx--;
        }

        if (count > maxCount) {
          maxCount = count;
        }

        dir[0] = count;

        // 동쪽

        count = 0;
        nx = i;
        ny = j + 1;

        while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
          if (board[nx][ny] === 0) {
            count++;
          } else if (board[nx][ny] === 6) {
            break;
          }
          ny++;
        }

        if (count > maxCount) {
          maxCount = count;
        }

        dir[1] = count;

        // 남쪽

        count = 0;
        nx = i + 1;
        ny = j;

        while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
          if (board[nx][ny] === 0) {
            count++;
          } else if (board[nx][ny] === 6) {
            break;
          }
          nx++;
        }

        if (count > maxCount) {
          maxCount = count;
        }

        dir[2] = count;

        // 서쪽

        count = 0;
        nx = i;
        ny = j - 1;

        while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
          if (board[nx][ny] === 0) {
            count++;
          } else if (board[nx][ny] === 6) {
            break;
          }
          ny--;
        }

        if (count > maxCount) {
          maxCount = count;
        }

        dir[3] = count;

        // 북쪽 방향이 가장 많은 면적을 차지할경우

        if (maxCount === dir[0]) {
          nx = i - 1;
          ny = j;
          while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
            if (board[nx][ny] === 0) {
              board[nx][ny] = "#";
            } else if (board[nx][ny] === 6) {
              break;
            }
            nx--;
          }
        }

        // 동쪽 방향이 가장 많은 면적을 차지할 경우
        else if (maxCount === dir[1]) {
          nx = i;
          ny = j + 1;

          while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
            if (board[nx][ny] === 0) {
              board[nx][ny] = "#";
            } else if (board[nx][ny] === 6) {
              break;
            }
            ny++;
          }
        }

        // 남쪽 방향이 가장 많은 면적을 차지 할 경우
        else if (maxCount === dir[2]) {
          nx = i + 1;
          ny = j;

          while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
            if (board[nx][ny] === 0) {
              board[nx][ny] = "#";
            } else if (board[nx][ny] === 6) {
              break;
            }
            nx++;
          }
        }

        // 서쪽 방향이 가장 많은 면적을 차지 할 경우
        else if (maxCount === dir[3]) {
          nx = i;
          ny = j - 1;

          while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
            if (board[nx][ny] === 0) {
              board[nx][ny] = "#";
            } else if (board[nx][ny] === 6) {
              break;
            }
            ny--;
          }
        }
      }
      // 2번 카메라
      else if (board[i][j] === 2) {
        let maxCount = 0;
        let dir = {
          0: 0,
          1: 0,
        };

        let count = 0;

        // 동서방향일때

        let ewCount = 0;
        count = 0;
        nx = i;
        ny = j + 1;

        while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
          if (board[nx][ny] === 0) {
            ewCount++;
            count++;
          } else if (board[nx][ny] === 6) {
            break;
          }
          ny++;
        }

        dir[0] += count;

        count = 0;
        nx = i;
        ny = j - 1;

        while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
          if (board[nx][ny] === 0) {
            count++;
            ewCount++;
          } else if (board[nx][ny] === 6) {
            break;
          }
          ny--;
        }

        dir[0] += count;

        if (ewCount > maxCount) {
          maxCount = ewCount;
        }

        // 남북 방향일때

        let nsCount = 0;

        count = 0;
        nx = i + 1;
        ny = j;

        while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
          if (board[nx][ny] === 0) {
            count++;
            nsCount++;
          } else if (board[nx][ny] === 6) {
            break;
          }
          nx++;
        }

        dir[1] += count;

        count = 0;
        nx = i - 1;
        ny = j;
        while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
          if (board[nx][ny] === 0) {
            count++;
            nsCount++;
          } else if (board[nx][ny] === 6) {
            break;
          }
          nx--;
        }

        dir[1] += count;

        if (nsCount > maxCount) {
          maxCount = nsCount;
        }

        // 동서방향이 가장 면적 크게 차지할때

        if (maxCount === dir[0]) {
          nx = i;
          ny = j + 1;

          while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
            if (board[nx][ny] === 0) {
              board[nx][ny] = "#";
            } else if (board[nx][ny] === 6) {
              break;
            }
            ny++;
          }

          nx = i;
          ny = j - 1;

          while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
            if (board[nx][ny] === 0) {
              board[nx][ny] = "#";
            } else if (board[nx][ny] === 6) {
              break;
            }
            ny--;
          }
        }

        // 남북방향이 가장 면적 크게 차지할때
        else if (maxCount === dir[1]) {
          nx = i + 1;
          ny = j;

          while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
            if (board[nx][ny] === 0) {
              board[nx][ny] = "#";
            } else if (board[nx][ny] === 6) {
              break;
            }
            nx++;
          }

          nx = i - 1;
          ny = j;
          while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
            if (board[nx][ny] === 0) {
              board[nx][ny] = "#";
            } else if (board[nx][ny] === 6) {
              break;
            }
            nx--;
          }
        }
      }
      // 3번 카메라
      else if (board[i][j] === 3) {
        let dir = {
          rightUp: 0,
          leftUp: 0,
          rightBottom: 0,
          leftBottom: 0,
        };

        let maxCount = 0;
        let count = 0;

        // 오른쪽 위로 90도일때

        let rightUpCount = 0;

        // 위쪽방향
        count = 0;
        let nx = i - 1;
        let ny = j;
        while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
          if (board[nx][ny] === 0) {
            count++;
            rightUpCount++;
          } else if (board[nx][ny] === 6) {
            break;
          }
          nx--;
        }

        // 오른쪽방향
        count = 0;
        nx = i;
        ny = j + 1;

        while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
          if (board[nx][ny] === 0) {
            count++;
            rightUpCount++;
          } else if (board[nx][ny] === 6) {
            break;
          }
          ny++;
        }

        dir["rightUp"] += rightUpCount;

        if (rightUpCount > maxCount) {
          maxCount = rightUpCount;
        }

        // 왼쪽 위로 90도일때
        let leftUpCount = 0;

        // 위쪽방향
        count = 0;
        nx = i - 1;
        ny = j;
        while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
          if (board[nx][ny] === 0) {
            count++;
            leftUpCount++;
          } else if (board[nx][ny] === 6) {
            break;
          }
          nx--;
        }

        // 서쪽 방향

        count = 0;
        nx = i;
        ny = j - 1;

        while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
          if (board[nx][ny] === 0) {
            count++;
            leftUpCount++;
          } else if (board[nx][ny] === 6) {
            break;
          }
          ny--;
        }

        dir["leftUp"] += leftUpCount;

        if (leftUpCount > maxCount) {
          maxCount = leftUpCount;
        }

        // 오른쪽 아래 90도 일때

        let rightBottomCount = 0;

        // 동쪽 방향일때

        count = 0;
        nx = i;
        ny = j + 1;

        while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
          if (board[nx][ny] === 0) {
            count++;
            rightBottomCount++;
          } else if (board[nx][ny] === 6) {
            break;
          }
          ny++;
        }

        // 남쪽 방향일때

        count = 0;
        nx = i + 1;
        ny = j;

        while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
          if (board[nx][ny] === 0) {
            count++;
            rightBottomCount++;
          } else if (board[nx][ny] === 6) {
            break;
          }
          nx++;
        }

        dir["rightBottom"] += rightBottomCount;
        if (rightBottomCount > maxCount) {
          maxCount = rightBottomCount;
        }

        // 왼쪽 아래 90도일때

        let leftBottomCount = 0;

        // 서쪽 방향
        count = 0;
        nx = i;
        ny = j - 1;

        while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
          if (board[nx][ny] === 0) {
            count++;
            leftBottomCount++;
          } else if (board[nx][ny] === 6) {
            break;
          }
          ny--;
        }

        // 남쪽 방향

        count = 0;
        nx = i + 1;
        ny = j;

        while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
          if (board[nx][ny] === 0) {
            count++;
            leftBottomCount++;
          } else if (board[nx][ny] === 6) {
            break;
          }
          nx++;
        }

        dir["leftBottom"] += leftBottomCount;

        if (leftBottomCount > maxCount) {
          maxCount = leftBottomCount;
        }

        // 오른쪽 위가 가장 많은 면적 차지할때
        if (maxCount === dir["rightUp"]) {
          nx = i - 1;
          ny = j;
          while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
            if (board[nx][ny] === 0) {
              board[nx][ny] = "#";
            } else if (board[nx][ny] === 6) {
              break;
            }
            nx--;
          }

          nx = i;
          ny = j + 1;

          while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
            if (board[nx][ny] === 0) {
              board[nx][ny] = "#";
            } else if (board[nx][ny] === 6) {
              break;
            }
            ny++;
          }
        }
        // 왼쪽 위가 가장 많은 면적 차지할때
        else if (maxCount === dir["leftUp"]) {
          nx = i - 1;
          ny = j;
          while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
            if (board[nx][ny] === 0) {
              board[nx][ny] = "#";
            } else if (board[nx][ny] === 6) {
              break;
            }
            nx--;
          }

          nx = i;
          ny = j - 1;

          while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
            if (board[nx][ny] === 0) {
              board[nx][ny] = "#";
            } else if (board[nx][ny] === 6) {
              break;
            }
            ny--;
          }
        }
        // 오른쪽 아래가 가장 많은 면적 차지할때
        else if (maxCount === dir["rightBottom"]) {
          nx = i;
          ny = j + 1;

          while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
            if (board[nx][ny] === 0) {
              board[nx][ny] = "#";
            } else if (board[nx][ny] === 6) {
              break;
            }
            ny++;
          }

          // 남쪽 방향일때

          nx = i + 1;
          ny = j;

          while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
            if (board[nx][ny] === 0) {
              board[nx][ny] = "#";
            } else if (board[nx][ny] === 6) {
              break;
            }
            nx++;
          }
        }
        // 왼쪽 아래가 가장 많은 면적 차지할때
        else if (maxCount === dir["leftBottom"]) {
          nx = i;
          ny = j - 1;

          while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
            if (board[nx][ny] === 0) {
              board[nx][ny] = "#";
            } else if (board[nx][ny] === 6) {
              break;
            }
            ny--;
          }

          // 남쪽 방향

          nx = i + 1;
          ny = j;

          while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
            if (board[nx][ny] === 0) {
              board[nx][ny] = "#";
            } else if (board[nx][ny] === 6) {
              break;
            }
            nx++;
          }
        }
      }
      // 4번 카메라
      else if (board[i][j] === 4) {
        let maxCount = 0;
        let dir = {
          upLeftRight: 0,
          bottomLeftRight: 0,
        };

        // 북동서 방향일때
        let upLeftRightCount = 0;

        // 북쪽
        let nx = i - 1;
        let ny = j;
        while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
          if (board[nx][ny] === 0) {
            upLeftRightCount++;
          } else if (board[nx][ny] === 6) {
            break;
          }
          nx--;
        }

        // 동쪽 방향

        nx = i;
        ny = j + 1;

        while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
          if (board[nx][ny] === 0) {
            upLeftRightCount++;
          } else if (board[nx][ny] === 6) {
            break;
          }
          ny++;
        }

        // 서쪽 방향

        nx = i;
        ny = j - 1;

        while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
          if (board[nx][ny] === 0) {
            upLeftRightCount++;
          } else if (board[nx][ny] === 6) {
            break;
          }
          ny--;
        }

        dir["upLeftRight"] += upLeftRightCount;

        if (upLeftRightCount > maxCount) {
          maxCount = upLeftRightCount;
        }

        // 남동서 방향일때

        let bottomRightLeftCount = 0;

        nx = i + 1;
        ny = j;

        while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
          if (board[nx][ny] === 0) {
            bottomRightLeftCount++;
          } else if (board[nx][ny] === 6) {
            break;
          }
          nx++;
        }

        nx = i;
        ny = j + 1;

        while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
          if (board[nx][ny] === 0) {
            bottomRightLeftCount++;
          } else if (board[nx][ny] === 6) {
            break;
          }
          ny++;
        }

        // 서쪽 방향

        nx = i;
        ny = j - 1;

        while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
          if (board[nx][ny] === 0) {
            bottomRightLeftCount++;
          } else if (board[nx][ny] === 6) {
            break;
          }
          ny--;
        }

        dir["bottomLeftRight"] += bottomRightLeftCount;

        if (bottomRightLeftCount > maxCount) {
          maxCount = bottomRightLeftCount;
        }

        // 북동서방향이 가장 많은 면적 차지할때

        if (maxCount === dir["upLeftRight"]) {
          nx = i - 1;
          ny = j;
          while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
            if (board[nx][ny] === 0) {
              board[nx][ny] = "#";
            } else if (board[nx][ny] === 6) {
              break;
            }
            nx--;
          }

          // 동쪽 방향

          nx = i;
          ny = j + 1;

          while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
            if (board[nx][ny] === 0) {
              board[nx][ny] = "#";
            } else if (board[nx][ny] === 6) {
              break;
            }
            ny++;
          }

          // 서쪽 방향

          nx = i;
          ny = j - 1;

          while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
            if (board[nx][ny] === 0) {
              board[nx][ny] = "#";
            } else if (board[nx][ny] === 6) {
              break;
            }
            ny--;
          }
        }

        // 남동서방향이 가장 많은 면적 차지할때
        else if (maxCount === dir["bottomLeftRight"]) {
          nx = i + 1;
          ny = j;

          while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
            if (board[nx][ny] === 0) {
              board[nx][ny] = "#";
            } else if (board[nx][ny] === 6) {
              break;
            }
            nx++;
          }

          nx = i;
          ny = j + 1;

          while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
            if (board[nx][ny] === 0) {
              board[nx][ny] = "#";
            } else if (board[nx][ny] === 6) {
              break;
            }
            ny++;
          }

          // 서쪽 방향

          nx = i;
          ny = j - 1;

          while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
            if (board[nx][ny] === 0) {
              board[nx][ny] = "#";
            } else if (board[nx][ny] === 6) {
              break;
            }
            ny--;
          }
        }
      }
      // 5번 카메라
      else if (board[i][j] === 5) {
        // 북쪽
        let nx = i - 1;
        let ny = j;
        while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
          if (board[nx][ny] === 0) {
            board[nx][ny] = "#";
          } else if (board[nx][ny] === 6) {
            break;
          }
          nx--;
        }

        // 동쪽

        nx = i;
        ny = j + 1;

        while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
          if (board[nx][ny] === 0) {
            board[nx][ny] = "#";
          } else if (board[nx][ny] === 6) {
            break;
          }
          ny++;
        }

        // 남쪽

        nx = i + 1;
        ny = j;

        while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
          if (board[nx][ny] === 0) {
            board[nx][ny] = "#";
          } else if (board[nx][ny] === 6) {
            break;
          }
          nx++;
        }

        // 서쪽

        nx = i;
        ny = j - 1;

        while (nx >= 0 && ny >= 0 && nx < N && ny < M) {
          if (board[nx][ny] === 0) {
            board[nx][ny] = "#";
          } else if (board[nx][ny] === 6) {
            break;
          }
          ny--;
        }
      }
    }
  }

  for (let i = 0; i < N; i++) {
    for (let j = 0; j < M; j++) {
      if (board[i][j] === 0) {
        answer++;
      }
    }
  }

  return answer;
}

console.log(solution(N, M, board));

거진 하드코딩으로 풀었는데, 모든 테스트케이스는 통과하는데 제출하면 틀리다고한다..

거진 2-3시간을 작성했던 코드라 아까워서 일단 저장해놓기 위해 올린다.

profile
https://brgndy.me/ 로 옮기는 중입니다 :)

0개의 댓글