Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- PCA
- BOF
- Algorithm
- DART
- MDP
- 백준
- BFS
- system hacking
- llm을 활용 단어장 앱 개발일지
- C++
- Widget
- ML
- MATLAB
- rao
- Flutter
- fastapi를 사용한 파이썬 웹 개발
- BAEKJOON
- study book
- Image Processing
- FastAPI
- Dreamhack
- 파이토치 트랜스포머를 활용한 자연어 처리와 컴퓨터비전 심층학습
- pytorch
- Got
- Stream
- 영상처리
- bloc
- Computer Architecture
- ARM
- Kaggle
Archives
- Today
- Total
Bull
[백준] 1987: 알파벳 (C++) 본문
https://www.acmicpc.net/problem/1987
문제
좌표의 크기가 주어지고, (1,1)부터 시작하는데 같은 알파벳을 만나면 안될때 까지 상하좌우로 움직일 시 최대한 많이 갈 수 있는 칸은 몇인지 찾는 문제이다.
아이디어
DFS와 백트래킹을 이용한다.
인접한 상하좌우 좌표를 확인하여 기록된 알파벳이 없으면 DFS를 호출한다.
여기서 백트래킹을 추가하여 DFS를 통해 visited(알파벳)을 기록하는데 갈수 있는 곳 까지 간 후 다시 visited를 해제하는 방식을 이용한다.
위 GIF는 문제의 예제로 백트래킹과 DFS가 어떻게 동작하는 지 그림판으로 나타내보았다.
H-A에서
H-A-D-G-J-F
H-A-J-G-D
H-A-J-F-D
의 DFS가 적용되고
H-F에서
H-F-J-A-D-G
H-F-J-G-D-A
H-F-J-G-A (GIF에는 실수로 못넣었다 더있을수도..)
H-F-D
이런식으로 총 7번의 경우 중 6칸을 움직이는 게 최대가 된다.
매번 칸을 이동할 때 마다 maxPathLength의 길이와 비교하여 최대값을 저장시켜준다.
Code
#include <algorithm>
#include <iostream>
#define MAX 20
using namespace std;
int R, C; // 행과 열의 크기
char board[MAX][MAX]; // 보드에 쓰여진 알파벳을 저장하는 배열
bool visited[26] = {false}; // 방문한 알파벳을 추적하는 배열
// 네 방향 이동을 위한 변화량: 상, 하, 좌, 우
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};
int maxPathLength = 0; // 최대 경로 길이
void dfs(int row, int col, int pathLength) {
// max
maxPathLength = max(pathLength, maxPathLength);
// 네 방향 탐색
for (int dir = 0; dir < 4; ++dir) {
int newRow = row + dx[dir];
int newCol = col + dy[dir];
// 보드 범위 내에 있고, 방문하지 않은 알파벳이면 탐색
if (newRow >= 0 && newRow < R && newCol >= 0 && newCol < C) {
int idx = board[newRow][newCol] - 'A';
if (!visited[idx]) {
visited[idx] = true;
dfs(newRow, newCol, pathLength + 1);
visited[idx] = false; // 방문 상태 원상 복귀
}
}
}
}
void init() {
cin.tie(NULL);
cout.tie(NULL);
ios::sync_with_stdio(false);
}
int main() {
init();
cin >> R >> C;
for (int i = 0; i < R; ++i) {
for (int j = 0; j < C; ++j) {
cin >> board[i][j];
}
}
visited[board[0][0] - 'A'] = true;
// dfs(int row, int col, int pathLength)
dfs(0, 0, 1);
cout << maxPathLength << endl;
return 0;
}
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준] 14502: 연구소 (C++) (0) | 2024.05.14 |
---|---|
[백준] 2206: 벽 부수고 이동하기 (C++) (0) | 2024.05.13 |
[백준] 1707: 이분 그래프 (C++) (0) | 2024.05.11 |
[백준] 10830: 뱀과 사다리 게임 (C++) (0) | 2024.05.08 |
[백준] 10830: 행렬 제곱 (C++) (0) | 2024.04.04 |