1. 문제
https://www.acmicpc.net/problem/4396
2. 풀이과정
1. 지뢰 정보만 있는 배열 mines를 구성한다.
2. 사용자가 밟은 땅 정보 배열 opend를 구성한다.
3. 사용자가 밟은 땅을 전체 순회하면서, 만약 해당 위치가 'x'라면 주변 8방향으로 지뢰 갯수 확인하고 표시한다.
4. 만약 사용자가 지뢰를 밟은 적이 있다면, 모든 지뢰를 공개한다.
5. 최종적으로 표시한 전체 배열을 출력합니다.
❗주의할 점
만약 'x' 위치가 지뢰라면 'x'와 상관없이 보드판의 모든 지뢰를 표시해야한다. 이를 위해 hitMine 변수를 사용
3. 자바스크립트 정답코드
const fs = require('fs');
const filepath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
const input = fs.readFileSync(filepath).toString().split('\n');
const n = parseInt(input.shift());
const mines = input.slice(0, n).map(line => line.split(''));
const opend = input.slice(n, 2 * n).map(line => line.split(''));
// 사용자가 지뢰를 밟은 경우를 추적하는 변수
let hitMine = false;
const dr = [0, -1, 0, 1, -1, -1, 1, 1];
const dc = [1, 0, -1, 0, 1, -1, 1, -1];
function main() {
for (let i = 0; i < n; i++){
for (let j = 0; j < n; j++){
if (opend[i][j] == 'x') { // 사용자가 연 보드판이라면
opend[i][j] = countAdjacentMines(i, j); //지뢰 확인
}
}
}
// 만약 사용자가 지뢰를 밟았다면 모든 지뢰를 공개함
if (hitMine) {
revealAllMines();
}
// 결과 출력
printResult();
}
// 해당 위치 주변의 지뢰 갯수 반환 함수
function countAdjacentMines(r, c) {
if (mines[r][c] === '*') { // 만약 해당 위치에 지뢰가 있다면
hitMine = true; // 지뢰를 찾았음을 표시
return '*'; // '*' 반환
}
let count = 0;
for (let i = 0; i < 8; i++) { // 8방향으로 검사하여 주변 지뢰의 갯수 계산
let nr = r + dr[i], nc = c + dc[i];
if (nr < 0 || nc < 0 || nr >= n || nc >= n) continue; //범위를 벗어나는 경우
if (mines[nr][nc] === '*') count++;
}
return count;
}
// 만약 지뢰를 밟은 경우, 모든 지뢰를 공개시키는 함수
function revealAllMines() {
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if (mines[i][j] === '*') {
opend[i][j] = '*';
}
}
}
}
// 결과 출력 함수
function printResult() {
for (let i = 0; i < n; i++) {
console.log(opend[i].join(''));
}
}
// 메인 함수 실행
main();
'🏆 PS(Problem Solving) > Baekjoon' 카테고리의 다른 글
[Node.js] 백준 Javascript 1244 스위치 켜고 끄기 (0) | 2024.06.01 |
---|---|
[C++] 백준 4396 지뢰 찾기 (0) | 2024.06.01 |
[Node.js] 백준 javascript 2578 빙고 (0) | 2024.05.30 |
[C++] 백준 2578 빙고 (0) | 2024.05.30 |
[C++] 백준 20546 기적의 매매법 (1) | 2024.05.29 |