Algorithm

[BOJ] 9202. Boggle

프로그래민 2020. 9. 12. 00:42
반응형

Trie와 백트래킹을 이용한 시뮬레이션 문제이다.

이 문제를 맨처음 보았을 때 일종의 사전 개념인 처음 5개의 입력을 보고 Trie 알고리즘을 사용할 생각을 하였다. 그리고 map이 4x4로써 크지 않고, 주어진 시간도 10초로 충분하여서 백트래킹을 통해 만들어질수 있는 모든 단어에 대해 Trie search를 해주는 방식으로 접근하였다.

여러가지 알고리즘이 혼합되어 있는 형태이기때문에 작은 실수만 해도 어려워 질수 있었던 문제였다. Trie와 다른 알고리즘을 같이 사용해볼 수 있던 좋은 문제였던 것 같다.

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
package study5;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;
 
public class Main_bj_9202_Boggle {
    
    static class Pos{
        int i,j;
        Pos(int i,int j){
            this.i=i;this.j=j;
        }
    }
    
    static class Node{
        boolean isEnd;
        Node[] child;
        Node(){
            isEnd=false;child=new Node[26];
        }
    }
    
    static class Boggle implements Comparable<Boggle>{
        String word; int score;
        Boggle(String w, int s) {
            word=w;score=s;
        }
        @Override
        public int compareTo(Boggle o) {
            if(score==o.score) {
                return word.compareTo(o.word);
            }
            return -Integer.compare(score, o.score);
        }
    }
    
    static List<Boggle> list;
    static Set<String> set;
    
    
    static int[] di= {-1,-1,0,1,1,1,0,-1};
    static int[] dj= {0,1,1,1,0,-1,-1,-1};
    
    static Node root;
    static char[][] map;
    static boolean[][] visit;
    
    
    
    public static void main(String[] args) throws Exception {
        BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
        int N=Integer.parseInt(br.readLine());
        root=new Node();
        for(int i=0;i<N;i++) {
            String str= br.readLine();
            insert(str);
        }
        
        br.readLine();
        
        int T=Integer.parseInt(br.readLine());
        
        for(int tc=0;tc<T;tc++) {
            set=new HashSet<>();
            list=new ArrayList<>();
            map=new char[4][4];
            visit=new boolean[4][4];
            
            for(int i=0;i<4;i++) {
                String line =br.readLine();
                for(int j=0;j<4;j++) {
                    map[i][j]=line.charAt(j);
                }
            }
            
            
            for(int i=0;i<4;i++) {
                for(int j=0;j<4;j++) {
                    visit[i][j]=true;
                    dfs(i,j,1,map[i][j]+"");
                    visit[i][j]=false;
                }
            }
            
            int sum=0;
            for(String str :set) {
                int num=strToScore(str);
                sum+=num;
                list.add(new Boggle(str, num));
            }
            
            Collections.sort(list);
            
            System.out.println(sum+" "+list.get(0).word + " "+ set.size() );
            
            
            br.readLine();
        }
    }
 
    static void dfs(int i,int j,int count,String str) {
        if(count ==9) {
            return;
        }
        
        if(search(str)==true) {
            set.add(str);
        }
        
        for(int dir=0;dir<8;dir++) {
            int nextI=i+di[dir];
            int nextJ=j+dj[dir];
            
            if(nextI<0 || nextI>=4 || nextJ<0 || nextJ>=4)
                continue;
            
            if(visit[nextI][nextJ]==false) {
                visit[nextI][nextJ]=true;
                dfs(nextI,nextJ,count+1,str+map[nextI][nextJ]);
                visit[nextI][nextJ]=false;
            }
            
        }
    }
    
    static int strToScore(String str) {
        int len=str.length();
        if(len==1  || len ==2) {
            return 0;
        }else if(len==3  || len ==4) {
            return 1;
        }else if(len==5) {
            return 2;
        }else if(len==6) {
            return 3;
        }else if(len==7) {
            return 5;
        }else if(len==8) {
            return 11;
        }
        return 0;
    }
 
    static boolean search(String str) {
        Node cur=root;
        
        for(int i=0;i<str.length();i++) {
            int alp=str.charAt(i)-'A';
            
            if(cur.child[alp]==null)
                return false;
            
            cur=cur.child[alp];
        }
        
        if(cur.isEnd==true)
            return true;
        return false;
        
    }
    
    
    static void insert(String str) {
        Node cur= root;
        
        for(int i=0;i<str.length();i++) {
            int alp=str.charAt(i)-'A';
            
            if(cur.child[alp]==null) {
                cur.child[alp]=new Node();
            }
            
            cur=cur.child[alp];
        }
        cur.isEnd=true;
    }
}
 
                                      
반응형

'Algorithm' 카테고리의 다른 글

[BOJ] 1043. 거짓말  (0) 2021.05.04
[Programmers] 가사 검색  (0) 2020.09.15
[BOJ] 5052. 전화번호 목록  (0) 2020.09.10
[BOJ] 1744. 수 묶기  (2) 2020.09.08
[BOJ] 1541. 잃어버린 괄호  (0) 2020.09.05