728x90
반응형
2024.07.30기준 - 실버5
백준, BEAKJOON, BOJ, JAVA, 자바
풀이
이 문제는 입력 받은 지뢰밭을 통해 지뢰가 아닌 곳에 주변에 지뢰가 몇개인지 수를 확인하고 출력하는 문제입니다.
1. 우선 참조하는 지뢰밭 위치에서 대각선, 상, 하, 좌, 우를 가기 위한 좌표이동 배열을 생성했습니다.
static int[] dx = {-1, 0, 1, -1, 1, -1, 0, 1}; // 대각선, 상, 하, 좌, 우 이동 좌표
static int[] dy = {-1, -1, -1, 0, 0, 1, 1, 1};
2. 입력받은 지뢰밭을 char[][] 변수에 저장했습니다.
map = new char[h][w];
for (int i = 0; i < h; i++) {
s = br.readLine();
for (int j = 0; j < w; j++) {
map[i][j] = s.charAt(j);
}
}
3. 현재 지뢰밭을 하나 하나 참조하면서 지뢰라면 그대로 출력을 아니라면 주변에 지뢰 수를 출력합니다.
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
if (map[i][j] == '*') {
sb.append(map[i][j]); // 지뢰이면 그대로 지뢰를 출력
} else {
sb.append(find(i, j)); // 주변에 지뢰수를 출력
}
}
sb.append("\n");
}
지뢰가 아니라면 주변에 지뢰를 찾는 함수를 호출합니다.
// 현재 좌표 주변에 몇 개의 지뢰가 있는지 확인하는 함수.
private static int find(int y, int x) {
int nowy = y;
int nowx = x;
int count = 0;
int nexty, nextx;
for (int i = 0; i < 8; i++) {
nexty = nowy + dy[i];
nextx = nowx + dx[i];
if (check(nexty,nextx) && map[nexty][nextx] == '*') {
count++;
}
}
return count;
}
// 좌표가 지뢰밭 안 쪽으로 포함되는지 확인하는 함수.
private static boolean check(int y, int x) {
return y >= 0 && x >= 0 && y < h && x < w;
}
코드
package Main;
import java.io.*;
import java.util.*;
public class Main {
static int h, w;
static int[] dx = {-1, 0, 1, -1, 1, -1, 0, 1}; // 대각선, 상, 하, 좌, 우 이동 좌표
static int[] dy = {-1, -1, -1, 0, 0, 1, 1, 1};
static char[][] map; // 지뢰밭을 저장하는 변수
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
String s;
StringTokenizer st;
while (!(s = br.readLine()).equals("0 0")) {
st = new StringTokenizer(s);
h = Integer.parseInt(st.nextToken());
w = Integer.parseInt(st.nextToken());
map = new char[h][w];
for (int i = 0; i < h; i++) {
s = br.readLine();
for (int j = 0; j < w; j++) {
map[i][j] = s.charAt(j);
}
}
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
if (map[i][j] == '*') {
sb.append(map[i][j]); // 지뢰이면 그대로 지뢰를 출력
} else {
sb.append(find(i, j)); // 주변에 지뢰수를 출력
}
}
sb.append("\n");
}
}
bw.write(sb.toString());
bw.flush();
bw.close();
br.close();
}
// 현재 좌표 주변에 몇 개의 지뢰가 있는지 확인하는 함수.
private static int find(int y, int x) {
int nowy = y;
int nowx = x;
int count = 0;
int nexty, nextx;
for (int i = 0; i < 8; i++) {
nexty = nowy + dy[i];
nextx = nowx + dx[i];
if (check(nexty,nextx) && map[nexty][nextx] == '*') {
count++;
}
}
return count;
}
// 좌표가 지뢰밭 안 쪽으로 포함되는지 확인하는 함수.
private static boolean check(int y, int x) {
return y >= 0 && x >= 0 && y < h && x < w;
}
}
728x90
반응형
'코딩테스트 일기 (BAEKJOON)' 카테고리의 다른 글
BEAKJOON / 백준 - JAVA 14429번 배스킨라빈스 31 (0) | 2024.08.01 |
---|---|
BAEKJOON / 백준 - JAVA 1384번 메시지 (0) | 2024.07.31 |
BAEKJOON / 백준 - JAVA 31432번 소수가 아닌 수 3 (0) | 2024.07.29 |
BEAKJOON / 백준 - JAVA 24482번 알고리즘 수업 - 깊이 우선 탐색 4 (0) | 2024.07.29 |
BAEKJOON / 백준 - JAVA 1541번 잃어버린 괄호 (0) | 2024.07.28 |