Algorithm/SWEA

[swexpert 2819] 격자판의 숫자 이어 붙이기

반응형

[swexpert 2819] 격자판의 숫자 이어 붙이기


문제 출처 : 링크




4x4 말판에 0~9까지 임의의 수가 작성된다.


지나온 말판도 다시 지나갈 수 있는 것이 포인트. dfs로 접근하는데 방문하는 부분을 따로 지정하지 않으면 될 것 같다.


말판에서 총 6번 움직이면서 (처음에 시작하는 지점 포함) 총 7자리의 수가 만들어지면 저장한다


이때 모든 경우의 수를 진행하면서, 중복되는 부분은 없애고 총 몇 가지 수를 만들 수 있는 지 구해야하는 문제다.



숫자를 int로 만들지 않고, 그냥 문자열로 받아서 저장하는 방식으로 접근했다.


HashSet에 저장하면, 중복되는 부분은 추가로 저장하지 않으므로 이 문제에서 사용하면 좋을 것 같아서 적용해봤다.


만약 ArrayList나 배열을 사용한다면, 저장 전에 조건문을 통해 중복 부분을 체크해줘야겠지만 HashSet은 알아서 중복을 걸러주기 때문에 그럴 필요가 없다.


마지막으로 해당 HashSet의 size를 출력해주면, 총 만들 수 있는 개수가 나오게 될 것이다.




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
61
62
63
64
65
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.StringTokenizer;
 
public class Solution2819 {
    
    static String[][] map;
    static HashSet<String> set; // 중복을 저장하지 않기 위한 HashSet
    
    static int dx[] = {00-11};
    static int dy[] = {-1100};
 
    public static void dfs(int x, int y, int cnt, String str){
        
        if(cnt == 7) { // 7개 채우면 hashset에 저장 후 return
            set.add(str);
            return;
        }
        
        for (int i = 0; i < 4; i++) { // 상하좌우 움직이기
            int nx = x + dx[i];
            int ny = y + dy[i];
            
            if(nx<0 || nx>=4 || ny<0 || ny>=4continue// 배열 밖으로 벗어나면 continue
            else {
                dfs(nx, ny, cnt+1, str+map[nx][ny]); // cnt 늘리고, str에 해당 수 추가
            }
        }
    }
    
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        int ts = Integer.parseInt(st.nextToken());
        set = new HashSet<String>();
        
        for (int t = 1; t <= ts ; t++) {
            
            map = new String[4][4];
            set.clear(); // 다음 테스트 케이스를 위해 hashset 비워주기
            
            for (int i = 0; i < 4; i++) {
                st = new StringTokenizer(br.readLine(), " ");                
                for (int j = 0; j < 4; j++) {
                    map[i][j] = st.nextToken();
                }
            }
            
            
            for (int i = 0; i < 4; i++) {
                for (int j = 0; j < 4; j++) {
                    String str = map[i][j]; // 첫번째 값 저장
                    dfs(i, j, 1, str);
                }
            }
            
            System.out.println("#"+t+ " " + set.size());
        }
    }
 
}
 
cs


반응형

'Algorithm > SWEA' 카테고리의 다른 글

[SWEA 4301] 콩 많이 심기(Java)  (0) 2019.04.01
[swexpert 1494] 사랑의 카운슬러 (java)  (0) 2019.03.06
[swexpert] 1224. 최단 경로  (2) 2019.02.12
[swexpert] 1228. 암호문1  (0) 2019.01.29
[swexpert] 1210. Ladder1  (0) 2019.01.14