백준/ Silver 4 문제 , 백준 Node.js 자바스크립트 4396 지뢰 찾기 [문자열]
✔️Check Point ! ( 해당사항 ✓체크 )
1. 막힘 없이 수월하게 풀린 문제인가?
2. 1시간이내로 풀렸던 문제인가?
3. 1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?
4. 시간을 써도 도무지 풀 수 없는 문제인가?
5. 솔루션을 찾아봤는가?
-------------------------------------------------------------------------------------------
난이도 체감 🧑💻
1. 최상
2. 상
3. 중
4. 하
이해도 🙆♂️
1. 완벽히 이해
2. 다소 헷갈리는 부분들이 있음
3. 이해 못함
문제 출처 🏠
https://www.acmicpc.net/problem/4396
문제풀이 소감 🧑💻
구현 양이 실버 4 수준은 아닌 것 같은 느낌이다.
골드 수준의 BFS 문제들이랑 유사하게 느껴졌음.
실수 할 수 있는 부분들이 있으니 주의하자.
요구사항 📋
처음에는 지뢰에 대한 정보들이 주어지고, 이후에는 플레이어가 열어본 위치에 대한 정보들이 주어진다.
이 둘을 서로 확인해서 현재의 게임 판을 다시 출력한다.
지뢰가 있는 곳을 아직 열지 않았다면, 열어본 위치들에서의 주변 지뢰 갯수에 대한 정보들을 출력하고, 만약, 1개라도 지뢰가 있는 곳을 열었다면, 주변 지뢰 개수에 대한 정보 + 지뢰에 대한 위치들도 모두 출력한다.
주의 ❗
열었는데, 주변에 지뢰가 없다면 => 0
열지 않았다면 => 점(.)
열지 않았는데 지뢰를 열었다면 => *
열은 자리에 지뢰가 있다면 => *
해결 전략 📝
상하좌우 대각선까지 모두 파악해야하므로 dr 을 참조해서 써야하므로 8방향에대한 이동 위치를 먼저 선언한다.
0으로 초기화한 TxT 크기의 2차원 배열을 선언한 뒤 이 배열에 주변 지뢰에 대한 정보들을 저장해 나아간다.
우선 지뢰가 담긴 배열을 탐색하면서 지뢰가 있는 위치라면 8방향으로 위에서 만든 2차원배열에서 지뢰가 있는 위치를 기준으로 8방향으로 뻗어 나아가면서 다 +=1 을 해준다.
이때, 지뢰가 있는 위치를 user가 열었다면 게임이 끝난 것이므로 check 변수에 'END' 를 할당하여 이후에 참고할 수 있게해준다.
이런식으로 지뢰가 담긴 배열을 모두 탐색한 뒤
user 가 열어본 위치에 대한 정보들을 탐색한다.
이때 결과를 저장할 result 변수를 선언하여 하나씩 저장해나아가면서 행을 기준으로 완성된 결과들을 출력하자.
열린 위치에서 check 변수가 'END' 로 할당되어있다면 지뢰를 한번이라도 열어본 경우이므로 지뢰가 담긴 위치는 지뢰(*)를 저장 아니라면 주변 지뢰의 개수에 대한 정보를 저장하자.
닫힌 위치라면 점(.)을 저장하는데, 이때 check 변수가 'END' 인 경우 닫혀있는 위치더라도 지뢰가 담겨있다면 지뢰(*) 을 저장한다.
정답 💯
const input = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trim()
.split("\n");
let input_T = input.shift();
input_T = Number(input_T);
let [...input_mine] = input;
let [...input_user] = input_mine.splice(input_T, input_T * 2);
function solution(T, mine, user) {
const dr_x = [-1, -1, -1, 0, 1, 1, 1, 0];
const dr_y = [-1, 0, 1, 1, 1, 0, -1, -1];
let check = "cotinue";
const nearMineCnt = (x, y) => {
for (let k = 0; k < 8; k++) {
const [mx, my] = [x + dr_x[k], y + dr_y[k]];
if (mx < 0 || mx >= T || my < 0 || my >= T) continue;
result[mx][my] += 1;
}
};
mine = mine.map((v) => v.trim().split(""));
user = user.map((v) => v.trim().split(""));
result = Array.from(Array(T), () => Array(T).fill(0));
for (let i = 0; i < T; i++) {
for (let j = 0; j < T; j++) {
if (mine[i][j] === "*") {
nearMineCnt(i, j);
if (user[i][j] === "x") check = "END";
}
}
}
result.forEach((line, i) => {
let answer = "";
line.forEach((v, j) => {
if ((user[i][j] === "x" && mine[i][j]) === ".") answer += v;
else if (mine[i][j] === "*" && check === "END") answer += "*";
else answer += ".";
});
console.log(answer);
});
}
solution(input_T, input_mine, input_user);
'알고리즘 공부 > 백준 - 자바스크립트' 카테고리의 다른 글
백준/ Gold 4 문제 , 백준 Node.js 자바스크립트 9252 LCS 2 [최장 공통 부분 수열] (1) | 2022.11.14 |
---|---|
백준/ Gold 4 문제 , 백준 Node.js 자바스크립트 1987 알파벳 [DFS] (0) | 2022.11.13 |
백준/ Silver 4 문제 , 백준 Node.js 자바스크립트 9536 여우는 어떻게 울지? [문자열] (0) | 2022.11.11 |
백준/ Silver 4 문제 , 백준 Node.js 자바스크립트 16439 치킨치킨치킨 [완전탐색] (0) | 2022.11.09 |
백준/ Gold 5 문제 , 백준 Node.js 자바스크립트 2565 전깃줄 [LIS] (0) | 2022.11.08 |