C++로 코드를 짜려고 했었는데..
이 문제는 Playground에서 C++ 지원이 되지 않았다.
그래서 자바로 변경해서 디버깅을 하고, 다시 C++로 변경하였다.
한번에 코드를 다 짜면 좋은데,
코드 짜다가 아들 우유 주고, 산책 다녀오고, 밥 먹고 와서 다시 짜다 보니까
중간에 산으로 한번 갔다가 다시 돌아왔다.
핵심을 잘 생각하고, 종이에 먼저 써보고 코딩하는 습관을 들여야겠다.
C++ Code
class Solution {
public:
vector<vector> visited;
vector<vector> wall;
vector<vector> original_board;
int r_len;
int c_len;
int printFlag = 0;
int change(vector<vector>& board, int r, int c, int w){
//if(printFlag == 1)
// System.out.println(r + " " + c);
int wall_detected = 0;
if(r < 0 || r >= r_len || c < 0 || c>= c_len){
//if(printFlag == 1)
// System.out.println(r + " " + c + " return " + 1);
return 1;
}
if(board[r][c] == 'X'){
//if(printFlag == 1)
// System.out.println(r + " " + c + " return " + 0);
return 0;
}
if(w == 1)
wall[r][c] = 1;
if(visited[r][c] == 1){
//if(printFlag == 1)
// System.out.println(r + " " + c + " visited " + wall[r][c] );
//cout << "visited " << wall[r][c] << endl;
if(wall[r][c] == 0)
return 0;
return 1;
}
if(visited[r][c] == 1){
//cout << "visited " << wall[r][c] << endl;
if(wall[r][c] == 0)
return 0;
return 1;
}
//System.out.println("");
//cout << endl;
visited[r][c] = 1;
wall_detected = change(board, r, c-1, wall[r][c]);
if(wall_detected == 1)
wall[r][c] = 1;
wall_detected += change(board, r, c+1, wall[r][c]);
if(wall_detected == 1)
wall[r][c] = 1;
wall_detected += change(board, r-1, c, wall[r][c]);
if(wall_detected == 1)
wall[r][c] = 1;
wall_detected += change(board, r+1, c, wall[r][c]);
if(wall_detected == 1)
wall[r][c] = 1;
if(board[r][c] == 'O' && wall_detected == 0)
board[r][c] = 'X';
wall[r][c] = wall_detected;
//if(printFlag == 1)
// System.out.println("return " + r + " " + c + " " + wall_detected );
return wall_detected;
}
void solve(vector<vector>& board) {
r_len = board.size();
if(r_len == 0)
return;
c_len = board[0].size();
original_board = board;
for(int i = 0; i < r_len; i++){
vector wallvector;
vector visitedvector;
for(int j = 0; j < c_len; j++){
wallvector.push_back(0);
visitedvector.push_back(0);
}
wall.push_back(wallvector);
visited.push_back(visitedvector);
}
for(int i = 0; i < r_len; i++){
for(int j = 0; j < c_len; j++){
board[i][j] = original_board[i][j];
visited[i][j] = 0;
wall[i][j] = 0;
if(board[i][j] == 'O'){
if(i == 3 && j == 3)
printFlag = 2;
change(board, i, j, 0);
}
}
}
for(int i = 0; i < r_len; i++){
for(int j = 0; j < c_len; j++){
board[i][j] = original_board[i][j];
visited[i][j] = 0;
wall[i][j] = 0;
if(board[i][j] == 'O'){
if(i == 3 && j == 3)
printFlag = 2;
change(board, i, j, 0);
}
}
}
}
};
Java Code
class Solution {
//int visited[][];
//int wall[][];
int visited[][] = new int[1000][1000];
int wall[][] = new int[1000][1000];
char original_board[][] = new char[1000][1000];
int r_len;
int c_len;
int printFlag = 0;
int change(char[][] board, int r, int c, int w){
if(printFlag == 1)
System.out.println(r + " " + c);
int wall_detected = 0;
if(r < 0 || r >= r_len || c < 0 || c>= c_len){
if(printFlag == 1)
System.out.println(r + " " + c + " return " + 1);
return 1;
}
if(board[r][c] == 'X'){
if(printFlag == 1)
System.out.println(r + " " + c + " return " + 0);
return 0;
}
if(w == 1)
wall[r][c] = 1;
if(visited[r][c] == 1){
if(printFlag == 1)
System.out.println(r + " " + c + " visited " + wall[r][c] );
//cout << "visited " << wall[r][c] << endl;
if(wall[r][c] == 0)
return 0;
return 1;
}
//System.out.println("");
//cout << endl;
visited[r][c] = 1;
wall_detected = change(board, r, c-1, wall[r][c]);
if(wall_detected == 1)
wall[r][c] = 1;
wall_detected += change(board, r, c+1, wall[r][c]);
if(wall_detected == 1)
wall[r][c] = 1;
wall_detected += change(board, r-1, c, wall[r][c]);
if(wall_detected == 1)
wall[r][c] = 1;
wall_detected += change(board, r+1, c, wall[r][c]);
if(wall_detected == 1)
wall[r][c] = 1;
if(board[r][c] == 'O' && wall_detected == 0)
board[r][c] = 'X';
wall[r][c] = wall_detected;
if(printFlag == 1)
System.out.println("return " + r + " " + c + " " + wall_detected );
return wall_detected;
}
void solve(char[][] board) {
r_len = board.length;
if(r_len == 0)
return;
c_len = board[0].length;
for(int i = 0; i < r_len; i++){
for(int j = 0; j < c_len; j++){
wall[i][j] = 0;
visited[i][j] = 0;
original_board[i][j] = board[i][j];
}
}
int finish = 0;
for(int i = 0; i < r_len; i++){
for(int j = 0; j < c_len; j++){
board[i][j] = original_board[i][j];
visited[i][j] = 0;
wall[i][j] = 0;
if(board[i][j] == 'O'){
if(i == 2 && j == 5)
printFlag = 2;
if(printFlag == 1)
System.out.println("Call " + i + " " + j);
change(board, i, j, 0);
}
}
}
for(int i = 0; i < r_len; i++){
for(int j = 0; j < c_len; j++){
board[i][j] = original_board[i][j];
visited[i][j] = 0;
wall[i][j] = 0;
if(board[i][j] == 'O'){
if(i == 3 && j == 3)
printFlag = 2;
change(board, i, j, 0);
}
}
}
}
};