해결된 질문
작성
·
199
1
안녕하세요. 해당 문제의 코드를 다음과 같이 짰는데, 출력하면 항상 0이 출력됩니다.
강의에 나온 부분과 거의 동일한데, 어느 부분에서 오류가 발생하는지 잘 모르겠습니다. 감사합니다.
import java.util.*;
import java.io.*;
class Main {
final static int MAX = 50 + 10;
static boolean[][] map;
static boolean[][] visited;
static int W, H;
static int[] DirY = {-1, -1, -1, 0, 0, 1, 1, 1};
static int[] DirX = {-1, 0, 1, -1, 1, -1, 0, 1};
public static void dfs(int y, int x) {
visited[y][x] = true;
for(int i = 0; i < 8; i++) {
int newY = y + DirY[i];
int newX = x + DirX[i];
if(map[newY][newX] && visited[newY][newX] == false) {
dfs(newY, newX);
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// 0. 입출력
while(true) {
StringTokenizer st;
st = new StringTokenizer(br.readLine());
W = Integer.parseInt(st.nextToken());
H = Integer.parseInt(st.nextToken());
// 마지막 입력 값이 0이면 while 문 빠져나오기
if(W == 0 && H == 0)
break;
map = new boolean[MAX][MAX];
visited = new boolean[MAX][MAX];
for(int i = 1; i <= H; i++) {
st = new StringTokenizer(br.readLine());
for(int j = 1; j <= W; j++) {
map[i][j] = (Integer.parseInt(st.nextToken()) == '1') ? true : false;
}
}
int answer = 0;
for(int i = 1; i <=H; i++) {
for(int j = 1; j <=W; j++) {
if(map[i][j] && visited[i][j] == false) {
dfs(i, j);
answer++;
}
}
}
bw.write(String.valueOf(answer));
bw.newLine();
}
bw.close();
br.close();
}
}
답변 1
1
안녕하세요 버럼님 :)
코드 확인했는데 거의 정답에 가까운 것 같아요. 유일하게 수정해야되는 부분은 map[i][j]에 값을 담을 때 입니다! 이때 st.nextToken() == '1'과 비교하고 있기 때문에 1이라는 문자와 비교하고 있습니다. 다만 nextToken으로 입력 받은 형태는 정수형이기 때문에 어떤 정수도 ASCII 문자 1과 같다고 판단하지 않아서 map의 정보가 정상적으로 담기지 않는 것으로 보여요.
그래서 이 부분만 '1'과 비교하지 않고 1과 비교하도록 수정하면 될 것 같습니다!
이런 류의 버그를 디버깅할 때는 가장 먼저 입력이 제대로 들어왔는지를 확인해야 하는데, 지금 케이스는 바로 잡을 수 있을 것 같아요! 시험장에서는 버그도 직접 잡을 수 있어야 하니 잘 기억해두셔도 좋을 것 같습니다!
공부 화이팅하세요!