문제 >> 2819. 격자판의 숫자 이어 붙이기 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.StringTokenizer;
 
public class Main_2819 {
    static HashSet<String> hs;
    static int[] dy = { -1100 };
    static int[] dx = { 00-11 };
    static char[][] map = new char[4][4];
 
    public static void main(String[] args) throws Exception {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
 
        int T = Integer.parseInt(bf.readLine());
 
        for (int tc = 1; tc <= T; tc++) {
            hs = new HashSet<String>();
            for (int i = 0; i < 4; i++) {
                StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
                for (int j = 0; j < 4; j++) {
                    map[i][j] = st.nextToken().charAt(0);
                }
            } // 입력 받기
 
            for (int i = 0; i < 4; i++) {
                for (int j = 0; j < 4; j++) {
                    solve(i, j, 0"" + map[i][j]);
                }
            }
 
            System.out.println("#" + tc + " " + hs.size());
        } // end of tc
    }
 
    static void solve(int y, int x, int depth, String s) {
 
        if (depth >= 6) {
            hs.add(s);
            return;
        } else {
            for (int i = 0; i < 4; i++) {
                int ny = y + dy[i];
                int nx = x + dx[i];
 
                if (ny < 0 || ny > 3 || nx < 0 || nx > 3)
                    continue;
 
                s = map[ny][nx]+s;
                
                solve(ny, nx, depth+1, s);
                
                s=s.substring(1);
        
            }
        }
 
    } // end of solve
}
 
cs


중복체크를 위해 Hashset을 사용했다.

Hashset은 중복된 원소에 대한 체크를 자동으로 해주기때문에

모든 경우를 Hashset에 삽입하고, 마지막에 Hashset의 size를 출력해주었다.


보통 중복체크는 boolean 타입의 배열을 사용하지만

문제에서  "0으로 시작하는 0102001과 같은 수를 만들 수도 있다." 라는 부분때문에

인덱스로 사용하지 못할 것으로 판단했다.


하지만 일곱자리 수로 결정되어있으므로 0으로 시작하는 숫자도 Integer 형으로 변환시키면

자동으로 앞의 0이 제거되면서 중복되지 않는 index가 될 수 있다.

0000123 => 123

0010234 => 10234

이런식으로 활용이 가능하다 

중복이 되지 않는 이유는 7자리로 고정되어있기때문이고

자리수가 고정되어있지않으면 활용이 불가능하다

 !


+ Recent posts