해결된 질문
작성
·
268
1
안녕하세요 강사님.
문제를 풀고 백준에 제출했을 때 계속 오답으로 나와 질문 드립니다..
제가 봤을 때 강사님 코드랑 거의 비슷하게 수정까지 한 것 같은데.. 어떤 부분이 잘못되었는지 확인 한번 부탁드립니다.
import java.io.*;
import java.util.StringTokenizer;
public class Main {
final static int MAX = 50 + 10;
static boolean map[][];
static boolean visited[][];
/* static int dirY[] = {1, 1, 1, 0, 0, -1, -1, -1};
static int dirX[] = {-1, 0, 1, -1, 1, -1, 0, 1};*/
static int dirY[] = {-1, -1, 0, 1, 1, -1, 0, -1};
static int dirX[] = {0, 1, 1, -1, 0, -1, -1, -1};
static int N, M;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
while (true) {
StringTokenizer st = new StringTokenizer(br.readLine());
M = Integer.parseInt(st.nextToken()); // 너비 x
N = Integer.parseInt(st.nextToken()); // 높이 y
if (N == 0 && M == 0) break;
map = new boolean[MAX][MAX];
visited = new boolean[MAX][MAX];
// 1. map 정보 반영
for (int i = 1; i <= N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 1; j <= M; j++) {
map[j][i] = Integer.parseInt(st.nextToken()) == 1;
}
}
// 2. dfs
int result = 0;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
if (map[i][j] && !visited[i][j]) {
dfs(i, j);
result++;
}
}
}
// 3. 출력
bw.write(String.valueOf(result));
bw.newLine();
}
bw.close();
bw.close();
}
private static void dfs(int y, int x) {
visited[y][x] = true;
for (int i = 0; i < 8; i++) {
int newY = dirY[i] + y;
int newX = dirX[i] + x;
if (map[newY][newX] && !visited[newY][newX]) {
dfs(newY, newX);
}
}
}
}
답변 1
2
안녕하세요 🙂
코드를 보니 두 곳이 수정되어야 할 것 같아요!
map 정보 입력 받는 단계에서 map[i][j] 에 입력 받는 게 아니고 map[j][i] 로 입력받아서 문제가 되는 것 같아요! map[j][i]로 입력 받으면 접근할 때도 동일하게 맞춰도 되는데, 제 강의에서 map[i][j] 로 말씀드렸습니다!
dirY dirX 가 8 방향을 다 표현하지 못하고 있습니다! 예를 들어 5번 7번 인덱스가 같은 위치를 가리키고 있으니 8방향 다 확인되게 수정해주면 답이 잘 나올것 같습니다 :)
계속 확인해도 눈에 안보였는데.. 감사합니다 ㅠㅠ