3-D 관련 질문
3
7 câu hỏi đã được viết
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
안녕하세요 강사님,
저는 이 문제를 풀며 불의 최소 거리와 사람의 최소 거리를 비교하며 풀 생각을 못했고,
그래서 DFS를 사용하면서, 불을 먼저 이동시키고 사람을 이동시키면서 불을 만나지 않고 탈출하는 경우에 대해 값을 찾았었습니다.
#include <bits/stdc++.h>
using namespace std;
int N,M;
int dy[4] = {0,0,1,-1};
int dx[4] = {1,-1,0,0};
int min_exit = INT_MAX;
vector<vector<int>> inp_map;
vector<vector<int>> fires_map;
vector<vector<pair<int,int>>> fires;
vector<vector<int>> visited;
bool can_exit = false;
void fire_flood(int level) {
for (int f=0; f<fires[level].size(); f++) {
int y = fires[level][f].first;
int x = fires[level][f].second;
fires_map[y][x] = 1;
for (int i=0; i<4; i++) {
int ny = y + dy[i];
int nx = x + dx[i];
if (ny >= 0 && nx >= 0 && ny < N && nx < M && inp_map[ny][nx] != 0 && inp_map[ny][nx] != 2) {
fires_map[ny][nx] = 1;
fires[level+1].push_back(make_pair(ny,nx));
}
}
}
}
void return_flood(int level) {
for (int f=0; f<fires[level].size(); f++) {
fires_map[fires[level][f].first][fires[level][f].second] = 0;
}
}
void dfs(int y, int x, int level) {
if (y == N-1 || x == M-1 || y == 0 || x == 0) {
can_exit = true;
min_exit = min(min_exit, level);
return;
}
visited[y][x] = 1;
fires.push_back(vector<pair<int,int>>());
fire_flood(level);
for (int i=0; i<4; i++) {
int ny = y + dy[i];
int nx = x + dx[i];
if (ny >= 0 && nx >= 0 && ny < N && nx < M && inp_map[ny][nx] != 0) {
if (inp_map[ny][nx] == 1 && visited[ny][nx] == 0) {
dfs(ny, nx, level+1);
}
}
}
return_flood(level+1);
fires.pop_back();
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
fires.push_back(vector<pair<int,int>>());
cin >> N;
cin >> M;
int sty, stx;
for (int i=0; i<N; i++) {
inp_map.push_back(vector<int>());
fires_map.push_back(vector<int>(M,0));
visited.push_back(vector<int>(M,0));
string temp;
cin >> temp;
for (int j=0; j<M; j++) {
if (temp[j] == '#')
inp_map[i].push_back(0);
else if (temp[j] == 'F') {
inp_map[i].push_back(2);
fires[0].push_back(make_pair(i,j));
} else if (temp[j] == 'J') {
inp_map[i].push_back(3);
sty = i, stx = j;
} else
inp_map[i].push_back(1);
}
}
dfs(sty,stx,0);
if (can_exit) cout << min_exit+1;
else cout << "IMPOSSIBLE";
return 0;
}
이 코드가 해당 코드인데요,, 시간복잡도에 있어서 훨씬 안좋은 코드인거같아요.
저런 불과 사람의 최단경로를 비교해야겠다! 라는 생각을 이끌어내는게 쉽지가 않은데, 어떻게 이런 생각하는 능력을 키울 수 있을까요. . .
Câu trả lời 1
0
안녕하세요, 인프런 AI 인턴입니다.
pshpark12345님, 질문에 대한 답변을 드립니다. 귀하의 문제는 불길과 사람이 동시에 움직이는 환경에서 최단 경로를 찾아 탈출해야 하는 과제입니다. 이 문제의 핵심은 즉, 불과 사람의 이동을 서로 독립적으로 BFS로 계산하여, 불이 도달하기 전에 사람이 탈출할 수 있는지를 판단하는 것입니다.
코드 개선 및 로직 설명
귀하의 코드는 DFS를 사용하여 불을 퍼뜨린 뒤, 사람을 이동시켜 문제를 해결하려 했습니다. 하지만, 이 방식은 폭발적으로 증가하는 상태 공간에서 효율적이지 않을 수 있습니다. BFS를 사용하여 불이 퍼지는 시간을 먼저 계산하고, 그 뒤에 사람이 이동 가능한 경로를 탐색하는 방식이 더 효과적입니다.
불의 퍼짐 BFS:
fire_bfs함수는 불이 각 위치에 도달하는 시간을 기록합니다. 각 단계에서 불이 주변으로 퍼져 나가며, 이 시간을 기록합니다.
지훈이의 탈출 BFS:
jihoon_bfs함수는 지훈이가 각 위치에 도달하는 시간을 기록하면서, 불보다 먼저 특정 경계에 도달하는지를 확인합니다.
학습 및 사고의 확장
불과 사람의 이동을 각각 BFS로 구현하는 이유는, 불이 어디까지 퍼질지와 사람이 어디로 갈 수 있는지를 독립적으로 파악하기 위함입니다. 이러한 생각을 키우려면 다음과 같은 연습을 해보세요:
유사 문제를 많이 풀기: 다양한 경로 탐색 문제를 풀면서, BFS와 DFS의 차이점 및 적절한 사용처를 익히는 것이 중요합니다.
구체적 문제 분석: 문제를 여러 관점에서 분석해보고, 상태를 나누어 생각하면서 가장 효율적인 방법을 찾아보세요.
기존 해답 연구: 다른 사람의 풀이를 보고, 그들의 사고방식을 이해하려 노력하세요. 이는 본인만의 전략을 세우는 데 큰 도움이 됩니다.
관련된 추가 상세한 설명이나 유사한 문제에 대한 조언과 생각도 다른 게시물에서 찾아보실 수 있습니다. 3-D 문제 시간초과 해결 방법 도 같은 문제를 해결하는 데 도움이 될 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
코살구 회원가입 문의
0
9
2
코살구 로그인 문제
0
31
2
3-A 문제 풀이 관련 질문
0
39
2
2-O 질문 있습니다
0
35
2
2-T 문제에 관한 질문
0
34
2
코딩 살구 클럽 접속 및 사용방법 문의
0
48
2
안녕하세요~. 현재 코살코딩클럽 사이트가 접속이 안됩니다~
0
61
2
코딩살구클럽 로그인문제
0
64
3
코딩 살구 클럽 로그인 문제
0
72
2
2-J 채점관련 질문
0
64
3
코딩 살구 클럽 Python 지원 가능 여부
0
74
1
살구클럽 아이디 없음 문제
0
74
1
1-O 코딩살구클럽 채점관련 질문
0
57
2
히든 테스트 케이스가 사라졌습니다
0
54
1
채점서버 혹시 다른 언어 지원도 가능하게 해주실 수 있나요
1
72
2
살구 클럽 채점 관련 문의(테스트 케이스)
0
65
2
1-H 문제 채점하기 오류
0
58
3
코딩살구클럽 2주차 2-L 문제 채점하기 오류
0
52
2
살구 클럽 채점 관련 문의
0
62
2
코딩 살구 클럽 실전 세션
0
57
2
코딩살구클럽 채점 관련 질문
0
50
2
코딩살구클럽 컴파일에러
0
79
2
5-B
0
49
2
4 - A
0
58
2

