Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

08_DFS_BFS #18

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions 08_DFS_BFS_/필수/2606.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#include <iostream>
#include <vector>

using namespace std;

int num, pair_num;
vector<vector<int>> li;
vector<bool> visited;

void doDfs(int index, vector<int>& ans_dfs){
visited[index]=true;
ans_dfs.push_back(index);

for(int i=1; i<=num; i++){
if(li[index][i]==1 && !visited[i]){
doDfs(i, ans_dfs);
}
}
}
Comment on lines +10 to +19

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: dfs를 이용한 풀이 너무 좋습니다!
주석이 있으면 더더욱 좋을 것 같습니다~!


int main(){
cin >> num;
cin >> pair_num;

li.assign(num + 1, vector<int>(num + 1, 0));
visited.assign(num + 1, false);

for(int i=0; i<pair_num; i++){
int a,b;
cin >> a >> b;
li[a][b]=li[b][a]=1;
}
vector<int> ans_dfs;
int index = 1;
doDfs(index, ans_dfs);

int count = ans_dfs.size() - 1; //방문한 노드의 수

cout << count;

return 0;
}
82 changes: 82 additions & 0 deletions 08_DFS_BFS_/필수/2615.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>

using namespace std;

const int MAX=19;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

바둑판의 크기를 상수로 미리 정의해두고 사용해주셨네요! 이런 식으로 반복해서 사용하는 숫자는 하드코딩하는 것보다 상수로 선언하는게 숫자를 잘못 적을 가능성도 적어지고, 유지보수할 때도 좋아요 👍👍👍

int map[20][20];
bool visit[20][20][4];
int dy[]={0, 1,1,1};
int dx[]={1,1,0,-1};
vector<pair<int, int>> pos;


bool cmp(pair<int, int> a, pair<int, int>b){
if(a.second >= b.second){
if(a.second == b.second){
if(a.first> b.first){
return false;
}
else return true;
}else return false;
}else return true;
Comment on lines +22 to +24

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: return 이후의 코드는 실행되지 않을 테니 어떻게 보면 else문과 같은 역할을 할 수 있어요. 따라서 if-return 사용 시, else문 사용은 지양해주세요!!

}

bool outrange(int y, int x){
if(y<1 || x<1 || y>MAX || x > MAX){
return false;
}
return true;
}

int check_next(int now_y, int now_x, int dir, int val, int cnt){
visit[now_y][now_x][dir]=true;
pos.push_back(make_pair(now_y, now_x));

int next_y=now_y+ dy[dir];
int next_x=now_x+ dx[dir];

if(!outrange(next_y, next_x) || map[next_y][next_x]!=val){
return cnt;
}
return check_next(next_y, next_x, dir, val, cnt+1);
}


int main(){

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

구현하시느라 너무 수고 많으셨습니다. 다만 주석이 있었으면 더 좋았을 것 같습니다! 다음 과제에서부터는 주석까지 꼭 달아주세요:)


for(int i=1; i<=MAX; i++){
for(int j=1; j<=MAX; j++){
cin >> map[i][j];
}
}

for (int i=1; i<=MAX; i++){
for(int j=1; j<=MAX; j++){
if(map[i][j]==0) continue;
for(int d=0; d<4; d++){
int ny=i+dy[d];
int nx=j+dx[d];

if(!outrange(ny,nx)) continue;
if(map[ny][nx]==map[i][j] && !visit[i][j][d]){
pos.clear();
visit[i][j][d]=true;
pos.push_back(make_pair(i,j));
if(check_next(ny,nx, d, map[i][j], 2)==5){
sort(pos.begin(), pos.end(), cmp);
cout << map[i][j] << "\n";
cout << pos[0].first << " " << pos[0].second;
return 0;
}
}
}
}
}

cout << 0;
return 0;

}
51 changes: 51 additions & 0 deletions 08_DFS_BFS_/필수/2644.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#include <iostream>
#include <vector>

using namespace std;

int n, a, b, m; //함수에서 사용할 변수를 전역 변수로 선언.
vector<vector<int>> li; // 그래프를 나타내는 인접 리스트
vector<bool> visited; // 방문 여부를 체크하는 벡터
int ans = -1; // 최종 촌수 저장, 기본값은 -1(친척 관계 없음)
Comment on lines +6 to +9

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: 꼼꼼한 주석 너무 좋습니다!


void dfs(int v, int num) { //dfs로 촌수 계산.
// 현재 노드 방문 처리
//찾길 원하는 사람의 번호에 방문 처리.
visited[v] = true;

if (v == b) { // 촌수를 구한 경우
ans = num; //촌수를 저장할 변수인 ans에 num값 저장.
return;
}

for (int i = 1; i <= n; i++) { //전체 사람의 수
if (li[v][i] == 1 && !visited[i]) { // 인접하고 아직 방문하지 않은 것에 대해 dfs 실행
dfs(i, num + 1); //dfs 함수 순환 호출
}
}
}
Comment on lines +11 to +26

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: dfs로 촌수 관계 계산을 잘 해주셨네요
함수가 달려있어 이해가 빨리 되었습니다!


int main() {
cin >> n; //전체 사람의 수
cin >> a >> b; //촌수를 찾을 사람의 번호
cin >> m; //부모와 자식 간의 관계의 개수

li.assign(n + 1, vector<int>(n + 1, 0)); //인접 리스트 li 초기화.
visited.assign(n + 1, false);//최초 방문 전, 아무도 방문하지 않았다는 의미로 모든 false 대입.

for (int i = 0; i < m; i++) {//m번 루프를 돌며 부모와 자식 간의 관계를 입력받음.
int c, d;
cin >> c >> d; //c:부모의 번호, d: 자식의 번호.
li[c][d] = li[d][c] = 1; // 양방향 그래프로 구성-> 부모-자식 간은 1촌 간. 어느 방향으로 보든 1촌이기에 양방향으로 선언해줌.
}

dfs(a, 0); //dfs함수 호출.

if (ans == -1) { //서로 아무런 관계가 없는 경우.
cout << -1 << "\n"; // 경로가 없는 경우
} else {
cout << ans << "\n"; // 최소 거리 출력
}

return 0;
}