Bactoria 황준오

오랫만에 DFS를 풀 때 마다 겪는 흔한 실수들

2019-06-23
bactoria

DFS 문제를 오랫만에 풀면 자잘한 실수들을 하게된다. 그 시간이 아까워서 포스팅 해두려고 한다.

1. X, Y좌표

int[][] map = new int [size][size];

for (int y = 0; int y < size; y++) {
    for (int x = 0; int x < size; x++) {
        int[][] map = new int[y][x];
    }
}
  • int[][] map = new int[y][x];
    • new int[x][y] 로 자주 실수함. (new int[j][i] 도 마찬가지)

 

2. 아스키코드

map 정보를 입력받을 때 한 열을 1 2 3 1 5가 아닌 12315 따위로 받을 경우

for (int y = 0; y < size; y++) {
    String row = br.readLine();
    for (int x = 0; x < size; x++) {
    //  map[y][x] = row.charAt(x);
        map[y][x] = row.charAt(x) - 48; // good
    }
}        

int형인 map에 1을 저장할 경우 1이 아닌 49로 저장됨.

int one = '1';
System.out.println(one); // 49

아스키코드의 49가 숫자 1이기 때문. 그래서 48을 빼줘야 한다.

12315를 배열로 받는 다른 방법도 있을 것 같은데 찾아보지 않았다.

 

3. tc 초기화

public class Solution {
    final static int SIZE = 5;

    static int[][] map = new int[SIZE][SIZE];
    static int visited = new boolean[SIZE][SIZE];
    static int result = 0;

    public static void main(String[] args) throws IOException {
        final int TC = 10;

        for (int tc = 1; tc <= TC; tc++) {
            //...
        }

        System.out.println(result);
    }
}

전역으로 map, visited, result를 선언과 동시에 초기화를 했다.

문제는 tc 한번 돌고나면 다음 tc를 수행할 때, 이전에 사용했던 데이터들(map, visited, result)이 초기화 되지 않는다. visited와 result는 이전의 tc에 영향을 받는다는 것.

따라서 tc가 시작할 때 마다 아래처럼 초기화를 해주어야 한다.

public class Solution {
    final static int SIZE = 5;

    static int[][] map;
    static int visited;
    static int result;

    public static void main(String[] args) throws IOException {
        final int TC = 10;

        for (int tc = 1; tc <= TC; tc++) {
            map = new int[SIZE][SIZE];
            visited = new boolean[SIZE][SIZE];
            result = 0;
            //...
        }

        System.out.println(result);
    }
}

황준오 (Bactoria) 황준오 (Bactoria)

.

Comments

Content