문제에는 잘못된 값이 들어올 수 없다고 되어있는데요.. 맞나요??
아무리 해도 WA가 뜨네요..ㅜ_ㅜ
다른 분들이 WA에 대해서 많이 건의하신거 같은데요.. 해당 문제에 대한 예시 input과 output을 좀더 늘려주시거나
많이 해서 txt 파일로 올려주시면 많은 도움이 될 것 같은데요 ㅎㅎ (문제 푸는 의미가 없어지려나;;)
아무튼 질문입니다. 알고리즘은 잘 몰라서;; 그냥 직관적으로 문제를 풀어가고 있는데요
자체적으로 샘플 만들어서 돌릴때는 문제가 없는데 자꾸 WA가 뜨네요.. 소스 첨부합니다.
ps:del_char 부분은 대충 만들어서 시간이 오래걸리는데 나중에 수정할 거에요 ㅎ
#include <stdio.h>
#include <windows.h>
#define UP 0x1
#define RIGHT 0x2
#define DOWN 0x4
#define LEFT 0x8
#define NONE 0
char board[26][82];
int row, col;
int down_check(int &, int &);
int right_check(int &, int &);
void del_char(int, int);
int main(){
int test_num;
int num_of_edge;
scanf("%d", &test_num);
for (int i=0 ; i<test_num ; i++){
int result=0;
int tmp_row, tmp_col;
scanf("%d %d", &row, &col);
// 초기화
for (int j=1 ; j<=row ; j++){
for (int k=1 ; k<=col ; k++){
scanf(" %c", &board[j][k]);
}
board[j][col+1]='';
}
for (int j=0 ; j<=col ; j++){
board[row+1][j]='';
}
// 계산 부분
for (int j=1 ; j<=row ; j++){
for (int k=1 ; k<=col ; k++){
if (board[j][k] == '*'){ // 문자 발견시
// 0, 5, 6, 8, 9 인 경우
if (board[j+1][k] == '*' && board[j][k+1] == '*'){
tmp_row=j, tmp_col=k;
while(board[j][k+1] == '*'){
board[j][k+1] = '_';
k++;
}
num_of_edge=down_check(tmp_row, tmp_col);
if (num_of_edge == RIGHT){ // 5, 9, 0 인 경우
num_of_edge=right_check(tmp_row, tmp_col);
if (num_of_edge == UP) // 0 이다
result+=0;
else if (num_of_edge == DOWN) // 5이다
result+=5;
else // 9이다
result+=9;
}
else{ // 6, 8인 경우
num_of_edge=right_check(tmp_row, tmp_col);
if (num_of_edge == DOWN) // 6이다
result+=6;
else // 8이다
result+=8;
}
del_char(tmp_row, tmp_col);
}
// 2, 3, 7인 경우
else if (board[j][k+1] == '*'){
while(board[j][k+1] == '*'){
board[j][k] = '_';
k++;
}
tmp_row=j, tmp_col=k;
num_of_edge = down_check(tmp_row, tmp_col);
if (num_of_edge == NONE) // 7이다
result+=7;
else if (num_of_edge == LEFT) // 2이다.
result+=2;
else // 3이다.
result+=3;
del_char(tmp_row, tmp_col);
}
// 1, 4 인 경우
else{
tmp_row=j, tmp_col=k;
num_of_edge=down_check(tmp_row, tmp_col);
if (num_of_edge == NONE)
result+=1;
else
result+=4;
del_char(tmp_row, tmp_col);
}
} // end if
} //end for k
} //end for j
printf("%dn", result);
}
return 0;
}
int down_check(int &i, int &j){
int result=NONE;
while(board[i+1][j]=='*'){
board[i][j]='_';
i++;
if(board[i][j+1]=='*' || board[i][j-1]=='*')
break;
}
if (board[i+1][j]=='*'){ // 아래에 문자가 있으면
result+=DOWN;
}
if (board[i][j+1]=='*'){ // 오른쪽에 문자가 있으면
result+=RIGHT;
}
else if(board[i][j-1]=='*') // 왼쪽에 문자가 있으면
result+=LEFT;
return result;
}
int right_check(int &i, int &j){
int result=NONE;
do{
board[i][j]='_';
j++;
}while (board[i+1][j]=='_' && board[i-1][j]=='_');
if (board[i+1][j]=='*'){ // 아래에 문자가 있으면
result+=DOWN;
}
if (board[i-1][j]=='*') // 위에 문자가 있으면
result+=UP;
return result;
}
void del_char(int i, int j){
board[i][j]='_';
if (board[i-1][j]=='*'){ // 위에 문자가 있을때
del_char(i-1, j);
}
if (board[i][j+1]=='*'){ // 오른쪽에 문자가 있을때
del_char(i, j+1);
}
if (board[i][j-1]=='*'){ // 왼쪽에 문자가 있을때
del_char(i, j-1);
}
if (board[i+1][j]=='*'){ // 아래에 문자가 있을때
del_char(i+1, j);
}
}
OneShot
문제에는 잘못된 값이 들어올 수 없다고 되어있는데요.. 맞나요??
아무리 해도 WA가 뜨네요..ㅜ_ㅜ
다른 분들이 WA에 대해서 많이 건의하신거 같은데요.. 해당 문제에 대한 예시 input과 output을 좀더 늘려주시거나
많이 해서 txt 파일로 올려주시면 많은 도움이 될 것 같은데요 ㅎㅎ (문제 푸는 의미가 없어지려나;;)
아무튼 질문입니다. 알고리즘은 잘 몰라서;; 그냥 직관적으로 문제를 풀어가고 있는데요
자체적으로 샘플 만들어서 돌릴때는 문제가 없는데 자꾸 WA가 뜨네요.. 소스 첨부합니다.
ps:del_char 부분은 대충 만들어서 시간이 오래걸리는데 나중에 수정할 거에요 ㅎ
if (num_of_edge == RIGHT){ // 5, 9, 0 인 경우 num_of_edge=right_check(tmp_row, tmp_col); if (num_of_edge == UP) // 0 이다 result+=0; else if (num_of_edge == DOWN) // 5이다 result+=5; else // 9이다 result+=9; } else{ // 6, 8인 경우 num_of_edge=right_check(tmp_row, tmp_col); if (num_of_edge == DOWN) // 6이다 result+=6; else // 8이다 result+=8; } del_char(tmp_row, tmp_col); } // 2, 3, 7인 경우 else if (board[j][k+1] == '*'){ while(board[j][k+1] == '*'){ board[j][k] = '_'; k++; } tmp_row=j, tmp_col=k;
num_of_edge = down_check(tmp_row, tmp_col); if (num_of_edge == NONE) // 7이다 result+=7; else if (num_of_edge == LEFT) // 2이다. result+=2; else // 3이다. result+=3; del_char(tmp_row, tmp_col); } // 1, 4 인 경우 else{ tmp_row=j, tmp_col=k; num_of_edge=down_check(tmp_row, tmp_col); if (num_of_edge == NONE) result+=1; else result+=4; del_char(tmp_row, tmp_col); } } // end if } //end for k } //end for j printf("%dn", result); } return 0; } int down_check(int &i, int &j){ int result=NONE; while(board[i+1][j]=='*'){ board[i][j]='_'; i++; if(board[i][j+1]=='*' || board[i][j-1]=='*') break; } if (board[i+1][j]=='*'){ // 아래에 문자가 있으면 result+=DOWN; } if (board[i][j+1]=='*'){ // 오른쪽에 문자가 있으면 result+=RIGHT; } else if(board[i][j-1]=='*') // 왼쪽에 문자가 있으면 result+=LEFT; return result; } int right_check(int &i, int &j){ int result=NONE; do{ board[i][j]='_'; j++; }while (board[i+1][j]=='_' && board[i-1][j]=='_'); if (board[i+1][j]=='*'){ // 아래에 문자가 있으면 result+=DOWN; } if (board[i-1][j]=='*') // 위에 문자가 있으면 result+=UP; return result; } void del_char(int i, int j){ board[i][j]='_'; if (board[i-1][j]=='*'){ // 위에 문자가 있을때 del_char(i-1, j); } if (board[i][j+1]=='*'){ // 오른쪽에 문자가 있을때 del_char(i, j+1); } if (board[i][j-1]=='*'){ // 왼쪽에 문자가 있을때 del_char(i, j-1); } if (board[i+1][j]=='*'){ // 아래에 문자가 있을때 del_char(i+1, j); } }15년 전