[Week 1] BOGGLE self review - yujungee
Closed this issue · 2 comments
yujungee commented
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가 찍히지 않았습니다.
함수에도 들어가지 않은 것 같습니다.
아마 전달 방식에 문제가 있는 것 아닐까 합니다.
Queue-ri commented
전역에 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; // 출력문
}
Queue-ri commented
아, 그리고 지금은 다 고치셨을지 모르겠지만..^^;
변수 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
이렇게 나오게끔 하는 경우가 일반적입니다.