본문 바로가기

분류 전체보기

(157)
#7576 토마토 문제는 위와같다(골드 5). 배운게 많았던 문제이다. dfs,bfs에대한 내 고정관념, 편협한 시각, 선입견, 아둔한 생각, 우둔한 사고, 굳어있는 코드 등을 깰 수 있었다. (ㅋㅋ) #include #include #include using namespace std; int m,n,big; int map[1001][1001]; //토마토 정보 입력 배열 int visited[1001][1001]; //방문기록 int date[1001][1001]; //최단 날짜 int dx[]={0,1,0,-1}; int dy[]={1,0,-1,0}; queue q; void bfs(){ //q.push(make_pair(y,x)); //visited[x][y]=1; while(!q.empty()){ int y=q.f..
#4963 섬의 개수 문제는 위와 같다(실버 2). 연결요소문제와 비슷한 종류의 문제이다. 구현은 어렵지 않았는데, 행과 열을 헷갈려서 애를 좀 먹었다.ㅠㅜ #include #include using namespace std; int w,h; int number; //섬의 개수 int map[51][51]; int visited[51][51]; int dx[]={0,1,1,1,0,-1,-1,-1}; int dy[]={1,1,0,-1,-1,-1,0,1}; void dfs(int y,int x){ visited[y][x]=1; for(int k=0;k
BFS의 특성 (최단경로) 그래프 상에서 길을 찾는 두가지 방법인 DFS와 BFS는 접근 우선순위에서 차이가 있다. 이 중 BFS는 방법의 특성상 최단 경로를 찾을 때 사용할 수 있다. 1. BFS의 특성 BFS는 방문한 정점을 queue에 push하고 queue내부에 가장 앞에 있는 원소를 기준삼아 다음 단계를 진행 한다. 이러한 특성상 BFS는 한곳만 집중해서 파고 돌아오는게(DFS의 방식) 아니라 여러군데를 한꺼번에 방문하며 나아가게 된다. 2. 최단경로? 위와 같은 BFS의 특성 덕분에, 지나가는 길에 여태껏 지나온 정점의 개수라던가 길의 길이를 기록한다면 이는 그 자체로 최단 경로가 된다. 최단경로 관련 문제는 DFS방식으로는 풀 수 없다! 3. 결론 최단경로 관련 문제는 BFS를 사용하자!
#2178 미로탐색 문제는 다음과 같다(실버1). 최단경로를 찾는 문제고 bfs를 사용해야했다. 백준 수업을 들은 상태여서 어렵지 않게 해결 가능 했다. 다만 답 찾는 아이디어가 좀 부족했다. #include #include #include #include #include using namespace std; int cnt=1; int n,m; int map[101][101]; int visited[101][101]; int dx[]={0,1,0,-1}; int dy[]={1,0,-1,0}; int dist[101][101]; queue q; void bfs(int x,int y){ q.push(make_pair(x,y)); visited[x][y]=1; dist[x][y]++; while(!q.empty()){ x=q.f..
#1012 유기농 배추 문제는 위와 같다. (실버2) 쉬운 dfs/bfs문제였다. 연결요소 문제랑 매우 흡사한 문제이다. 개인적으로 dfs보다 bfs가 더좋은것 같은데 사람들은 dfs를 더많이 쓰는듯; #include #include #include #include #include using namespace std; queue q; int M,N,K; //가로 세로 길이, 배추 개수 int check[51][51]; //방문했는지 확인하는 int a[51][51]; //인접행렬 int dx[] = {0,-1,0,1}; //한칸씩 움직일때 필요 int dy[] = {1,0,-1,0}; void bfs(int x,int y){ q.push(make_pair(x,y)); check[x][y] = 1; while(!q.empty()..
Vector 1. Vector 쉽게 말해 C에서의 배열과 비슷하다. 다만 배열은 한번 크기를 고정하면 수정하기 어려운 반면, 벡터는 동적으로 이를 조절 할 수 있다. 말 그대로 '동적 배열구조 클래스' 이다. 2. 선언 - 헤더파일 에 있다. #include 필수임. - 선언 방식은 vector 변수명; 이다. ex) vector v; - 선언과 동시에 초기화도 가능하다. 1. vector 변수명 (개수); 2. vector 변수명 (개수,초기화 값); ex) vector v(10,0); -> 10개의 공간을 0으로 초기화 함! ++ 이때 초기화 값은 디폴트 값이 있다. (int는 0, char은 스페이스 라고함) 3. 멤버 함수 v[idx] : 배열에서의 접근 방법과 같다. v.front() : 벡터에서 맨 앞의 ..
#2667 단지번호 붙이기 문제는 다음과 같다.(실버1) 연결요소 문제랑 사실상 똑같은 문제이다. #include #include #include using namespace std; int n; //지도의 크기 nxn int graph[30][30]; //지도 int d[25][25]; //방문했는지 체크 int dx[]={0,1,0,-1}; int dy[]={1,0,-1,0}; int sum[25*25]; //각 단지의 집의 개수를 넣을 배열 void bfs(int x,int y,int cnt){ queue q; q.push(make_pair(x,y)); d[x][y]=cnt; while(!q.empty()){ x=q.front().first; y=q.front().second; q.pop(); for(int i=0;i
#1707 이분 그래프 문제는 다음과 같다. (골드4) 여느 문제와 같이 변수에 대한 제한이 있고, 이를 지켜주지 않으면 런타임 에러가 난다.(이것때매 헤메기도 했음) 사실 그냥 조금 어려웠다...! #include #include #include #include #include using namespace std; vector a[20001]; int color[20001]; void dfs(int node, int c) { color[node] = c; for (int i=0; i