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시간을 작성했던 코드라 아까워서 일단 저장해놓기 위해 올린다.