[다섯번째 문제] 백준 / 1189 : 컴백홈

‍sw·2021년 10월 8일
0

1일 1문제

목록 보기
5/9

이건 정말 너무 쉬운 문제였는데 자꾸 사소한걸 놓친다.
인생이 반성의 연속이다.

#include <iostream>


using namespace std;

char board[5][5];

int checkBoard[5][5];

// start 위치 board[r-1][0]
// end   위치 board[0][c-1]
// 하나씩 탐색하다가 , K가 되었는데도 끝나지않으면 종료

int check(char board[5][5] , int checkBoard[5][5], int i , int j , int R, int C , int K , int current) {
	int cnt =0;
	if (current == K) return 0; // 길을 넘어가면 0

	if (current == K-1 && i == 0 && j == C- 1) return 1; // 길 숫자가 맞고 끝에 도착했으면 1
	
	if (checkBoard[i-1][j] == 0 && i != 0 && board[i - 1][j] == '.') { // 방문하지 않은점이면 위로 한칸 움직이기
		checkBoard[i-1][j] = 1;
		cnt += check(board,checkBoard, i - 1, j, R, C, K, current + 1);
		checkBoard[i-1][j] = 0;
	}
	if (checkBoard[i][j+1] == 0 && j != C-1 && board[i][j+1] == '.') { // 오른쪽으로 한칸 움직이기
		checkBoard[i][j+1] = 1;
		cnt += check(board,  checkBoard , i , j+1, R, C, K, current + 1);
		checkBoard[i][j+1] = 0;
	}
	if (checkBoard[i][j-1] == 0 && j != 0 && board[i][j - 1] == '.') { // 오른쪽으로 한칸 움직이기
		checkBoard[i][j-1] = 1;
		cnt += check(board, checkBoard, i, j -1, R, C, K, current + 1);
		checkBoard[i][j-1] = 0;
	}
	if (checkBoard[i+1][j] == 0 && i != R-1 && board[i+1][j] == '.') { // 오른쪽으로 한칸 움직이기
		checkBoard[i+1][j] = 1;
		cnt += check(board, checkBoard, i + 1, j , R, C, K, current + 1);
		checkBoard[i+1][j] = 0;
	}
	return cnt;
}
int main() {
	int R, C, K;

	cin >> R >> C >> K;

	for (int i = 0; i < 5; i++) {
		for (int j = 0; j < 5; j++) {
			checkBoard[i][j] = 0;
		}
	}

	for (int i = 0; i < R; i++) {
		for (int j = 0; j < C; j++) {
			cin >> board[i][j];
		}
	}
	checkBoard[R - 1][0] = 1;
	cout << check(board,checkBoard,  R-1 , 0 , R , C , K, 0);
	return 0;
}

이 문제를 풀때는 다음과 같은것을 놓쳤다.

  1. 최단 거리라는 말은 어디에도 없었는데 오른쪽 , 위 두 가지 방향만 고려했다.
    -> 네 가지 방향을 모두 고려해서 푸는게 맞다.
  2. checkBoard[R - 1][0] = 1; 이 부분을 까먹고 안적었다. 시작점으로 다시 돌아오는 경우가 있었을 것

그럼에도 불구하고 긍정적인 측면은 ,
예전에 본 방법을 기억하고 있다는 것이다.

if (checkBoard[i-1][j] == 0 && i != 0 && board[i - 1][j] == '.') { // 방문하지 않은점이면 위로 한칸 움직이기
		checkBoard[i-1][j] = 1;
		cnt += check(board,checkBoard, i - 1, j, R, C, K, current + 1);
		checkBoard[i-1][j] = 0;
	}

재귀적으로 함수를 작성할때 checkBoard 판을 수정해서 인자로 전달하고 , 다시 원래대로 변경하는 방법이다.

상당히 효과적인 방법이라고 생각된다.

Hits

0개의 댓글

관련 채용 정보