사이트: HackerRank
난이도: 미디움
bomberman은 아래 규칙대로 움직인다.
1. 초기 위치에 폭탄을 심는다.
2. 1 초 후는 동작하지 않는다.
3. 그 다음 1 초 후는 빈 곳 모든 cell에 폭탄을 심는다.
4. 그 다음 1 초 후는 3초 전 심었던 폭탄이 터진다.
5. 3, 4번 과정을 반복한다.
폭탄은 상하좌우로 한칸씩 터지며 옆에 폭탄이 있을 경우 제거 된다.
처음 폭탄이 터진 패턴과 그 다음 폭탄이 터진 후의 패턴이 계속 반복되므로 입력 받은 n을 계산하여 적절하게 패턴을 반환한다.
function bomberMan(n, grid) {
// Write your code here
if (n === 1) {
return grid;
}
if (n % 2 === 0) {
return grid.map(r => Array.from(r).map(c => "O").join(""));
}
function getBombed(g) {
let result = [];
function setResult(c, r, v) {
if (!result[r]) {
result[r] = [];
}
result[r][c] = v;
};
for (let i = 0; i < g.length; i++) {
for (let j = 0; j < g[i].length; j++) {
if (g[i][j] === ".") {
if (result[i] && result[i][j] === ".") {
continue;
}
setResult(j, i, "O");
} else {
setResult(j, i, ".");
if (i - 1 > -1 && g[i - 1][j] !== "O") {
setResult(j, i - 1, ".");
}
if (i + 1 < g.length && g[i + 1][j] !== "O") {
setResult(j, i + 1, ".");
}
if (j - 1 > -1 && g[i][j - 1] !== "O") {
setResult(j - 1, i, ".");
}
if (j + 1 < g[i].length&& g[i][j + 1] !== "O") {
setResult(j + 1, i, ".");
}
}
}
}
return result.map(r => r.reduce((ret, c) => ret += c, ""));
}
let bombCount = Math.floor(n / 2);
if (bombCount % 2 === 1) {
return getBombed(grid);
} else {
return getBombed(getBombed(grid));
}
}
바로 풀 수 있었던 문제들은 지금은 생략하고 추후 더 효율적인 문제 풀이법을 찾아보도록 하겠다.
(댓글로 알려주시면 정말 감사하겠습니다 ㅠㅠ)