알고리즘 문제해결 전략 1 권, 흔히 불리는 이름은 종만북 !
그럼 이제,,, 시작.. ( 내 글이랑 문제 글 색이랑 같아서 색을 수정 했다... )
6장 무식하게 풀기, 완전 탐색? 으로 모든 경우의 수를 찾아서 답을 찾아내는 방식
1. 예제 : 보글 게임 (문제 : ID : BOGGLE, 난이도 : 하)
https://algospot.com/judge/problem/read/BOGGLE
6장 내용이 무식하게 풀기라서 완탐으로 찾기 했었다.
시간초과가 발생했고, 보통 BFS / DFS 는 visited 배열을 만들어서
방문 했던 위치는 통과하는데 그 부분을 빠뜨렸다.. (위에 보면 빨간색으로 바꿔놓은 글이 그 부분이다.)
다른 정답 코드를 참고하여 다시 완성 !!
배열 쓰기 귀찮아서 string 했는데 4ms 속도가 나온다... C로 작성하면 0ms 가 될 것임!
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 | #include <iostream> #include <string> using namespace std; int C,N,ans; int dis[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}}; // 8 방향 int memo[5][5][10]; string pan[6]; string sent[10]; void dfs(int y, int x, int tidx, int sidx, int total, int now); int main(){ cin >> C; for(int tc = 0; tc < C; tc++){ //판 초기화 for(int i=0; i<6; i++) pan[i].clear(); //문장 초기화 for(int i=0; i<10; i++) sent[i].clear(); //판 입력 for(int i=0; i<5; i++) cin >> pan[i]; //문장 갯수 cin >> N; //문장 입력 for(int i=0; i<N; i++) cin >> sent[i]; //문장 검출 for(int i=0; i<N; i++){ ans = 0; //플래그 설정 //메모이제이션 용 배열 초기화 for(int j=0; j<5; j++) for(int k=0; k<5; k++) for(int l=0; l<10; l++) memo[j][k][l] = 0; //판 전체에서 첫글자 확인하고 시작 for(int j=0; j<5; j++){ for(int k=0; k<5; k++){ if(pan[j][k] == sent[i][0]){ dfs(j, k, i, 0, (int)sent[i].size(), 1); if(ans == 1) //문장 찾았으면 중단 break; } } if(ans == 1) //문장 찾았으면 중단 break; } //플래그로 답 출력 if(ans == 0){ cout << sent[i] << " " << "NO" << endl; }else if(ans == 1){ cout << sent[i] << " " << "YES" << endl; } } } } void dfs(int y, int x, int tidx, int sidx, int total, int now){ memo[y][x][sidx] = 1; //판에서 글자를 찾았을때 몇번째 문자인지 기억 if(total == now){ //찾는 문자의 갯수와 지금 현재 문자 위치의 수 비교 ans = 1; return; } int ty = y; int tx = x; for(int i=0; i<8; i++){ //8 방향 모두 검색 ty = y + dis[i][0]; tx = x + dis[i][1]; if(ty < 0 || tx < 0 || ty > 4 || tx > 4) continue; // 범위 초과시 종료 if(pan[ty][tx] == sent[tidx][sidx+1]){ //다음 문자를 확인 if(memo[ty][tx][sidx+1] == 1) continue; //해당 자리에 같은 문장의 같은 문자 위치면 pass dfs(ty, tx, tidx, sidx + 1, total, now + 1); // 재귀함수 } } return; } | cs |
질의 응답에서 테스트 케이스를 발견 했고 아래와 같음.
출처 ID : digression99
계속 오답나는 분들은 이 테스트 케이스를 시도해보세요.
// testcase
//4
//URLPM
//XPRET
//GIAET
//XTNZY
//XOQRS
//10
//PRETTY
//GIRL
//REPEAT
//KARA
//PANDORA
//GIAZAPX
//REPEAT
//KARA
//PANDORA
//URLPMPMPMM
//NNNNS
//NEEEN
//NEYEN
//NEEEN
//NNNNN
//4
//YESR
//SNNNNNNN
//EEEEEEEEE
//NEYN
//NNNNN
//NEEEN
//NEYEN
//NEEEN
//NSNNN
//1
//YES
//AAAAA
//AAAAA
//AAAAA
//AAAAA
//AAAAB
//4
//ABABABABAA
//AAAAAAAAAB
//ABABABABBA
//BAAAAAAABA
// result
//PRETTY YES
//GIRL YES
//REPEAT YES
//KARA NO
//PANDORA NO
//GIAZAPX YES
//REPEAT YES
//KARA NO
//PANDORA NO
//URLPMPMPMM NO
//YESR NO
//SNNNNNNN YES
//EEEEEEEEE YES
//NEYN NO
//YES YES
//ABABABABAA YES
//AAAAAAAAAB YES
//ABABABABBA NO
//BAAAAAAABA YES
끝 ! 앞으로 책의 커리큘럼은 아니지만, 문제 풀이용으로 풀어 나갈 것!
'컴퓨터공학 > 알고리즘 공부' 카테고리의 다른 글
[BOJ] 백준 문제풀이 15649 N과M(1) (0) | 2018.11.19 |
---|---|
[알고리즘 문제 해결 전략] Part 1. 6장 무식하게 풀기 [소풍] (0) | 2018.11.12 |
Quicksort 2 - Sorting Hackerrank 퀵정렬 퀵소트 문제! (0) | 2017.01.06 |
Quicksort 1 - Partition Hackerrank 퀵소트 퀵정렬 알고리즘 (0) | 2017.01.06 |
Insertion Sort 삽입 정렬 Hackerrank (0) | 2017.01.06 |