Queue-ri/Advanced-Algorithm-Study

[Week 1] BOGGLE self review - yujungee

Closed this issue · 2 comments

BOGGLE self review

1. 해결 시도 과정

배열을 이용해서 비교해줘야 겠다고 생각했습니다.

2. 아이디어

단어가 한글자씩 일치하는지 함수에서 확인해서 일치하면 dx와 dy를 더해주어 recursion을 이용하면 될 것이라 생각했습니다.

3. 코드 설명

#include <iostream>
using namespace std;

char matrix[5][5];  //  보글 게임판을 만든다.
string words[10];   // 단어를 저장할 배열
int position[10][5][5]; // 각 글자에 해당하는 x와 y 좌표의 위치
int N; // 입력받을단어 수 

int dx[8] = {-1, -1, -1, 1, 1, 1, 0, 0};    // dx
int dy[8] = {-1, 0, 1, -1, 0, 1, -1, 1};    // dy      dx는 좌측 -> 중간 -> 우측, dy는 하 -> 중 -> 상 기준

int findWord(const string word, int x, int y, int num) {
    if (x < 0 || x >= 5 || y < 0 || y >= 5) return 0;   // matrix 범위를 넘어갔을 때
    if (word.size() == 1)
        return word[0] == matrix[x][y]; // 단어가 한 글자 일 때 일치하면 바로 return
    int tORf = position[num][x][y]; // 일치하면 넣어줄 곳
    if (word[0] != matrix[x][y]) return tORf = 0; //일치하지 않으면 0
    for (int i = 0; i < 8; i++) {   // dx와 dy를 더해주고 재귀를 통해 확인
        if (tORf = findWord(word.substr(1), x + dx[i], y + dy[i], num + 1))
            return tORf;
    }
    
    return tORf;
}



int main() {
    int c;  // 테스트 횟수
    cin >> c;   // test 수 입력받음.
    for (int i=0; i<5; i++) {
        for (int j=0; j<5; j++) {
            cin >> matrix[i][j];
        }
    } // boggle판 입력받음
    
    cin >> N; //체크 할 단어 수
    string word[10]; // 단어 넣을 배열
    for (int i=0; i<N; i++) {
        cin >> word[i];
    } // 단어 입력받음
    
    for (int i = 0; i < N; i++) {
        int answer;
        for (int x = 0; x < 5; x++) {
            answer = 0;   // answer을 반복문 마다 0 설정
            for (int y = 0; y < 5; y++) {
                if (answer = findWord(words[i], x, y, 0)) break; // 일치 할 경우
            }
            if (answer) break;
        }
        cout << words[i] << " " << (answer ? "YES" : "NO") << endl; // 출력문
    }
    
    
    return 0;
}

4. xcode에서 돌려본 출력 결과

1
URLPM
XPRET
GIAET
XTNZY
XOQRS
6
PRETTY
GIRL
REPEAT
KARA
PANDORA
GIAZAPX
 NO
 NO
 NO
 NO
 NO
 NO

word를 입력받았는데 word가 찍히지 않았습니다.

함수에도 들어가지 않은 것 같습니다.

아마 전달 방식에 문제가 있는 것 아닐까 합니다.

전역에 words 배열을 선언하셨는데 main()에도 똑같은 용도의 word 배열을 선언한 뒤 서로 혼용하셨네요.

다음과 같이 수정해주면 언급하신 입출력 문제는 해결될 것 같습니다.

    for (int i = 0; i < N; i++) {
        int answer;
        for (int x = 0; x < 5; x++) {
            answer = 0;   // answer을 반복문 마다 0 설정
            for (int y = 0; y < 5; y++) {
-               if (answer = findWord(words[i], x, y, 0)) break; // 일치 할 경우
+               if (answer = findWord(word[i], x, y, 0)) break; // 일치 할 경우
            }
            if (answer) break;
        }
-       cout << words[i] << " " << (answer ? "YES" : "NO") << endl; // 출력문
+       cout << word[i] << " " << (answer ? "YES" : "NO") << endl; // 출력문
    }

아, 그리고 지금은 다 고치셨을지 모르겠지만..^^;

변수 c로 반복문을 안돌리셔서 테스트케이스가 하나밖에 안돌아가고 있네요.

이 부분은 간단히 수정하시면 될 듯 합니다.

그리고 한가지만 더 짚자면, string을 테스트케이스마다 최대 10개까지 한꺼번에 저장해서 일괄로 출력하시는데,

PS에서는 일반적으로 하나의 input마다 바로바로 출력합니다.

즉, 콘솔 환경에서는

1
URLPM
XPRET
GIAET
XTNZY
XOQRS
6
PRETTY
GIRL
REPEAT
KARA
PANDORA
GIAZAPX
PRETTY YES
GIRL YES
REPEAT YES
KARA NO
PANDORA NO
GIAZAPX YES

이게 아니라

1
URLPM
XPRET
GIAET
XTNZY
XOQRS
6
PRETTY
PRETTY YES
GIRL
GIRL YES
REPEAT
REPEAT YES
KARA
KARA NO
PANDORA
PANDORA NO
GIAZAPX
GIAZAPX YES

이렇게 나오게끔 하는 경우가 일반적입니다.