백준 2667 C++ | 백준2667 단지번호붙이기 – Dfs 풀이 12760 투표 이 답변

당신은 주제를 찾고 있습니까 “백준 2667 c++ – 백준2667 단지번호붙이기 – DFS 풀이“? 다음 카테고리의 웹사이트 isleartisan.com 에서 귀하의 모든 질문에 답변해 드립니다: isleartisan.com/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 치치 이(가) 작성한 기사에는 조회수 2,389회 및 좋아요 35개 개의 좋아요가 있습니다.

Table of Contents

백준 2667 c++ 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 백준2667 단지번호붙이기 – DFS 풀이 – 백준 2667 c++ 주제에 대한 세부정보를 참조하세요

설명하는 것은 너무 어렵습니다. 더구나 듣는이가 거부감이 들지 않도록 매끄럽게 설명하는 것은 더더욱 어렵습니다. 차근차근 꾸준히 변하도록 노력하겠습니다. 초심을 잃지 말자.

백준 2667 c++ 주제에 대한 자세한 내용은 여기를 참조하세요.

백준 알고리즘 2667번 단지 번호 붙이기 C언어 – 호로록

대각선상에 집이 있는 경우는 연결된 것이 아니다. <그림 2>는 <그림 1>을 단지별로 번호를 붙인 것이다. 지도를 입력하여 단지수를 출력하고, 각 단지에 …

+ 여기에 보기

Source: iamthejiheee.tistory.com

Date Published: 3/19/2022

View: 1471

[백준 2667번][C] 단지번호붙이기 (DFS) – SNUPI – 티스토리

[백준 2667번][C] 단지번호붙이기 (DFS) · 배열의 인접한 부분을 탐색하며 단지 수를 카운팅한다 · 더불어 나눠진 컴포넌트가 있는 그래프이므로 몇 개의 …

+ 자세한 내용은 여기를 클릭하십시오

Source: snupi.tistory.com

Date Published: 1/19/2021

View: 8964

[C++] 백준 2667번 – 단지 붙이기 (DFS) – 개발 블로그 – 티스토리

[C++] 백준 2667번 – 단지 붙이기 (DFS). Nanyoung Kim 2021. 3. 3. 00:54. 320×100. 문제 링크 : www.acmicpc.net/problem/2667 · 2667번: 단지번호붙이기.

+ 여기에 자세히 보기

Source: nanyoungkim.tistory.com

Date Published: 8/17/2021

View: 8715

[BOJ] 2667번 : 단지번호붙이기 (C언어) – velog

2667번: 단지번호붙이기정사각형 지도1 : 집이 있는 곳0 : 집이 없는 곳인접한 집끼리 단지 구성인접 : 상하좌우단지수 출력 후, 각 단지에 속하는 집 …

+ 여기에 보기

Source: velog.io

Date Published: 2/13/2022

View: 3234

[백준 2667 – C언어] 단지번호 붙이기: BFS

[백준 2667 – C언어] 단지번호 붙이기: BFS. excited-hyun 2021. 1. 28. 01:44. 320×100. www.acmicpc.net/problem/2667 · 2667번: 단지번호붙이기.

+ 자세한 내용은 여기를 클릭하십시오

Source: excited-hyun.tistory.com

Date Published: 8/12/2022

View: 9287

[알고리즘] 백준 2667번: 단지번호붙이기 (c언어) – 쥬코딩

[알고리즘] 백준 2667번: 단지번호붙이기 (c언어). 곽쥬 2022. 7. 2. 12:55. 320×100. 출처: https://www.acmicpc.net/problem/2667.

+ 여기를 클릭

Source: jicoding.tistory.com

Date Published: 1/10/2022

View: 8830

c언어 2667번 단지번호붙이기 (백준) – 지빠귀 – 티스토리

c언어 2667번 단지번호붙이기 (백준). 지빠귀 2022. 6. 11. 22:43. 반응형. #include int sum = 0; //dfs에서 몇개인지를 담는 변수 int n; //n*n int …

+ 여기에 더 보기

Source: h202.tistory.com

Date Published: 8/12/2021

View: 8991

[백준(BOJ)] 2667번 : 단지번호붙이기 – C++[CPP] – 퉁이리

https://www.acmicpc.net/problem/2667 과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다.

+ 여기에 자세히 보기

Source: tooo1.tistory.com

Date Published: 1/4/2022

View: 4352

[C언어/DFS] 2667 : 단지번호붙이기 – GB – 티스토리

프로그래밍/백준. [C언어/DFS] 2667 : 단지번호붙이기. whave 2022. 1. 4. 13:37. #include #include int arr[30][30]={0,}; int …

+ 여기에 보기

Source: giantbaby1012.tistory.com

Date Published: 11/2/2022

View: 2502

[백준 2667] 단지번호붙이기 C++ – 겜돌이의 개발일지

문제 백준 2667 단지번호붙이기 (C++) 과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다.

+ 더 읽기

Source: gamedoridori.tistory.com

Date Published: 3/6/2021

View: 2812

주제와 관련된 이미지 백준 2667 c++

주제와 관련된 더 많은 사진을 참조하십시오 백준2667 단지번호붙이기 – DFS 풀이. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

백준2667 단지번호붙이기 - DFS 풀이
백준2667 단지번호붙이기 – DFS 풀이

주제에 대한 기사 평가 백준 2667 c++

  • Author: 치치
  • Views: 조회수 2,389회
  • Likes: 좋아요 35개
  • Date Published: 2019. 10. 22.
  • Video Url link: https://www.youtube.com/watch?v=FUpd-sTyOzc

백준 알고리즘 2667번 단지 번호 붙이기 C언어

반응형

문제

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집들의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여기서 연결되었다는 것은 어떤 집이 좌우, 혹은 아래위로 다른 집이 있는 경우를 말한다. 대각선상에 집이 있는 경우는 연결된 것이 아니다. <그림 2>는 <그림 1>을 단지별로 번호를 붙인 것이다. 지도를 입력하여 단지수를 출력하고, 각 단지에 속하는 집의 수를 오름차순으로 정렬하여 출력하는 프로그램을 작성하시오.

입력

첫 번째 줄에는 지도의 크기 N(정사각형이므로 가로와 세로의 크기는 같으며 5≤N≤25)이 입력되고, 그 다음 N줄에는 각각 N개의 자료(0혹은 1)가 입력된다.

출력

첫 번째 줄에는 총 단지수를 출력하시오. 그리고 각 단지내 집의 수를 오름차순으로 정렬하여 한 줄에 하나씩 출력하시오.

문제 풀이

house_cnt 변수로 총 단지수를 카운팅함과 동시에 각 단지내 집에 house_cnt 값을 부여한다.

그러면 같은 단지에 있는 집들은 같은 값의 수를 갖게 된다.

1012번 유기농 배추와 유사한 풀이법을 갖는다.

각 단지내 집의 수를 오름차순으로 정렬하기 위해 bubble sort 방법을 사용했다.

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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 #include < stdio.h > #define SZ 26 int vectX[ 4 ] = { 0 , 0 , 1 , – 1 }; int vectY[ 4 ] = { 1 , – 1 , 0 , 0 }; int map[SZ][SZ]; int house_size; int house_cnt = 0 ; // 단지를 저장할 배열 = 나올 수 있는 단지의 최대 개수 = n * (n/2) + 1 int house[SZ * (SZ / 2 ) + 1 ]; void swap( int * arr, int left, int right) { int temp = arr[left]; arr[left] = arr[right]; arr[right] = temp; } void bubble_sort( int * arr) { for ( int i = 0 ; i < house_cnt; i + + ) { for ( int j = 0 ; j < house_cnt - 1 ; j + + ) { if (arr[j] > arr[j + 1 ]) { swap(arr, j, j + 1 ); } } } } void do_dfs( int x, int y, int key) { // key : 단지 개수를 의미.. 단지별 번호 이 값이 최종 단지의 개수가 된다. map[x][y] = key; int nextX; int nextY; for ( int i = 0 ; i < 4 ; i + + ) { nextX = x + vectX[i]; nextY = y + vectY[i]; if (nextX > = 0 & & nextY > = 0 & & nextX < house_size & & nextY < house_size) { //printf("map[%d][%d] = %d ", nextX, nextY, map[nextX][nextY]); if (map[nextX][nextY] = = 1 ) { // 좌표가 범위 안에 있으며 (x, y) 에서 (nextX, nextY)까지 가는 길이 있는 경우 do_dfs(nextX, nextY, key); } } } } void solution() { for ( int i = 0 ; i < house_size; i + + ) { for ( int j = 0 ; j < house_size; j + + ) { if (map[i][j] = = 1 ) { house_cnt + + ; do_dfs(i, j, house_cnt + 1 ); } } } for ( int i = 0 ; i < house_size; i + + ) { for ( int j = 0 ; j < house_size; j + + ) { if (map[i][j] > 1 ) { house[map[i][j] – 2 ] + + ; } } } } int main() { scanf ( “%d” , & house_size); for ( int i = 0 ; i < house_size; i + + ) { for ( int j = 0 ; j < house_size; j + + ) { scanf ( "%1d" , & map[i][j]); } } solution(); printf ( "%d " , house_cnt); bubble_sort(house); for ( int i = 0 ; i < house_cnt; i + + ) { printf ( "%d " , house[i]); } } http://colorscripter.com/info#e " target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter http://colorscripter.com/info#e” target=”_blank” style=”text-decoration:none;color:white”> cs

반응형

[백준 2667번][C] 단지번호붙이기 (DFS)

반응형

snupi.tistory.com/106

다음 문제는 백준 2667번 단지 번호 붙이기 문제이다

출처 : https://www.acmicpc.net/problem/2667

전형적인 DFS 또는 BFS 그래프 경로 순회 문제이다

배열의 인접한 부분을 탐색하며 단지 수를 카운팅한다

더불어 나눠진 컴포넌트가 있는 그래프이므로 몇 개의 컴포넌트인지 파악까지 해야 한다

마지막으로, 단지 수를 오름차순으로 출력한다

0. 전역 변수 설정

#include #define MAX 26 // 최대 25 인덱스까지 사용 int adj[MAX][MAX]; // 인접행렬 자료 만들 때 사용 int visited[MAX][MAX]; // 방문했는지 check int cntIdx; // 컴포넌스 수 int cnt[MAX*MAX/2]; // 각 컴포넌스의 단지 수

1. 지도의 크기와 자료 입력

// 지도의 크기 입력 scanf(“%d”, &N); // 지도를 전체 돌며 자료 입력 for(int i=1; i<=N; i++) { for(int j=1; j<=N; j++) { // %1d 로 숫자 하나씩 입력 scanf("%1d", &adj[i][j]); // adj가 0일 경우, 방문 check를 하여 순회하지 않도록 한다 if(adj[i][j] == 0) visited[i][j] = 1; } } 2. DFS 순회 void DFS(int hereY, int hereX, int N) { // 정점과 정점개수 int thereY, thereX; visited[hereY][hereX] = 1; // 방문 check cnt[cntIdx-1]++; // 컴포넌트의 단지 수 증가 // 인접 확인하기 (상하좌우 4가지) if(adj[hereY-1][hereX] == 1) { // there 설정 thereY = hereY-1; thereX = hereX; // visited 확인하고 재귀 if(!visited[thereY][thereX]) { DFS(thereY, thereX, N); //발견하자마자 바로 함수로 다시 들어가 } } if(adj[hereY+1][hereX] == 1) { // there 설정 thereY = hereY+1; thereX = hereX; // visited 확인하고 재귀 if(!visited[thereY][thereX]) { DFS(thereY, thereX, N); //발견하자마자 바로 함수로 다시 들어가 } } if(adj[hereY][hereX-1] == 1) { // there 설정 thereY = hereY; thereX = hereX-1; // visited 확인하고 재귀 if(!visited[thereY][thereX]) { DFS(thereY, thereX, N); //발견하자마자 바로 함수로 다시 들어가 } } if(adj[hereY][hereX+1] == 1) { // there 설정 thereY = hereY; thereX = hereX+1; // visited 확인하고 재귀 if(!visited[thereY][thereX]) { DFS(thereY, thereX, N); //발견하자마자 바로 함수로 다시 들어가 } } } // 나눠진 컴포넌트는 DFS()로 순회하지 못하므로, 행력 전체를 확인한다 void DFSAll(int N) { for(int i=1; i<=N; i++) { for(int j=1; j<=N; j++) { if(!visited[i][j]) { // 컴포넌트 수 증가 cntIdx++; DFS(i, j, N); } } } } 3. cntIdx 만큼의 cnt[] 배열을 정렬한 후에, 출력한다 반응형

[C++] 백준 2667번 – 단지 붙이기 (DFS)

728×90

문제 링크 : www.acmicpc.net/problem/2667

문제

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여기서 연결되었다는 것은 어떤 집이 좌우, 혹은 아래위로 다른 집이 있는 경우를 말한다. 대각선상에 집이 있는 경우는 연결된 것이 아니다. <그림 2>는 <그림 1>을 단지별로 번호를 붙인 것이다. 지도를 입력하여 단지수를 출력하고, 각 단지에 속하는 집의 수를 오름차순으로 정렬하여 출력하는 프로그램을 작성하시오.

입력

첫 번째 줄에는 지도의 크기 N(정사각형이므로 가로와 세로의 크기는 같으며 5≤N≤25)이 입력되고, 그 다음 N줄에는 각각 N개의 자료(0혹은 1)가 입력된다.

출력

첫 번째 줄에는 총 단지수를 출력하시오. 그리고 각 단지내 집의 수를 오름차순으로 정렬하여 한 줄에 하나씩 출력하시오.

접근 방법

map[0][0] ~ map[N-1][N-1] 까지 돌면서 방문하지 않은 곳에서 dfs를 호출한다. 호출하기 전에 cnt를 1로 초기화 한 뒤, dfs 함수 안에서 재귀로 dfs가 재호출 될 때마다 연결된 단지로 전진한 것이므로 cnt를 1씩 증가해준다. 처음에 호출한 dfs가 끝나면 cnt를 cntVec안에 push 해서 마지막에 출력할 수 있도록 저장하고, 단지 그룹 1개를 다 탐색한 것이므로 res를 1 증가시킨다.

#include #include #include #include using namespace std; int map[25][25]; int visited[25][25]; vector cntVec; //위 오 아 왼 int dr[4] = {-1,0,1,0}; int dc[4] = {0,1,0,-1}; int N; int cnt; void dfs(int r, int c){ for(int i = 0; i<4; i++){ int nr = r + dr[i]; int nc = c + dc[i]; if(nr>=N || nr<0 || nc>=N || nc<0) continue; if(visited[nr][nc]==0 && map[nr][nc]==1){ //방문 안했고 집이 있으면 visited[nr][nc] = 1; //방문했다고 표시하고 cnt+=1; //집 개수 세기 dfs(nr,nc); } } } int main(){ int res=0; cin >> N; string str; for(int i = 0; i> str; for(int j = 0; j

[BOJ] 2667번 : 단지번호붙이기 (C언어)

1. 문제

2667번: 단지번호붙이기

정사각형 지도

1 : 집이 있는 곳

0 : 집이 없는 곳

인접한 집끼리 단지 구성

인접 : 상하좌우

단지수 출력 후, 각 단지에 속하는 집 수를 오름차순으로 출력

2. 알고리즘

DFS 탐색으로 단지 구성

단지에서 집마다 count + 1

오름차순은 계수정렬로 구현

3. 소스코드

# include int graph [ 26 ] [ 26 ] = { 0 } ; int apart [ 26 * 26 ] = { 0 } ; int n , count , sum = 0 ; int dx [ 4 ] = { – 1 , 1 , 0 , 0 } ; int dy [ 4 ] = { 0 , 0 , – 1 , 1 } ; int dfs ( int x , int y ) { if ( x < 0 || y < 0 || x >= n || y >= n ) { return 0 ; } if ( graph [ x ] [ y ] == 1 ) { graph [ x ] [ y ] = 0 ; count ++ ; for ( int i = 0 ; i < 4 ; i ++ ) { dfs ( x + dx [ i ] , y + dy [ i ] ) ; } return 1 ; } return 0 ; } int main ( ) { scanf ( "%d" , & n ) ; for ( int i = 0 ; i < n ; i ++ ) { for ( int j = 0 ; j < n ; j ++ ) { scanf ( "%1d" , graph [ i ] + j ) ; } } for ( int i = 0 ; i < n ; i ++ ) { for ( int j = 0 ; j < n ; j ++ ) { if ( dfs ( i , j ) == 1 ) { apart [ count ] ++ ; count = 0 ; sum ++ ; } } } printf ( "%d " , sum ) ; for ( int i = 0 ; i < 26 * 26 ; i ++ ) { if ( apart [ i ] != 0 ) { int k = apart [ i ] ; for ( int j = 0 ; j < k ; j ++ ) { printf ( "%d " , i ) ; } } } return 0 ; } 4. C언어 공백없는 여러개의 숫자 입력받기

C언어] 단지번호 붙이기: BFS

728×90

www.acmicpc.net/problem/2667

문제

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여기서 연결되었다는 것은 어떤 집이 좌우, 혹은 아래위로 다른 집이 있는 경우를 말한다. 대각선상에 집이 있는 경우는 연결된 것이 아니다. <그림 2>는 <그림 1>을 단지별로 번호를 붙인 것이다. 지도를 입력하여 단지수를 출력하고, 각 단지에 속하는 집의 수를 오름차순으로 정렬하여 출력하는 프로그램을 작성하시오.

입력

첫 번째 줄에는 지도의 크기 N(정사각형이므로 가로와 세로의 크기는 같으며 5≤N≤25)이 입력되고, 그 다음 N줄에는 각각 N개의 자료(0혹은 1)가 입력된다.

출력

첫 번째 줄에는 총 단지수를 출력하시오. 그리고 각 단지내 집의 수를 오름차순으로 정렬하여 한 줄에 하나씩 출력하시오.

풀이

단지의 총 개수와 각각의 집 수를 오름차순으로 구하는 문제이다.

나는 정렬은 무조건 쉬운걸 쓰기 때문에 너무나 당연하게 버블 소트로 오름 차순 정렬!

bfs문제만 계속 풀다보니까 스텐다드한 문제들은 그냥 기계적으로 쓱싹 써내려가게된다.

bfs의 시작을 위해 큐가 빈 상태일 때 적당한 좌표를 넣어주는 일은 main의 2중 for문에서 수행한다.

이미 방문했거나 집이 없는 곳인 경우엔 bfs 탐색을 수행하지 않는다.

적당한 좌표에 대한 노드를 큐에 넣어주고 본격적으로 bfs탐색을 한다.

여기선 상하좌우로 인접한 집들만이 하나의 단지를 이루고 있다.

그러므로 상하좌우의 방향으로 한칸씩 이동하여 방문하지 않았고, 집이 있는 위치이며, map의 범위에 벗어나지 않는 경우만 큐에 추가하게 된다.

큐에서 뽑아서 상하좌우 이동을 하고 또 큐에 추가 하고 이를 반복하다보면 결국 큐가 텅 비게 된다.

이경우가 바로 하나의 단지를 탐색 완료한것이다.

따라서 총 단지 수를 증가시키고 그 단지 내 집의 수를 저장하며 쭉 진행해 주면 된다.

#include #include char map[25][25]; int visit[25][25]; int house_cnt; int house[625]; int space; int x[4] = {1, -1, 0, 0}; int y[4] = {0, 0, 1, -1}; struct Node{ int x; int y; struct Node *next; }; void bfs(struct Node *head, int n); int main(void){ int n; struct Node *head, *new; int temp; scanf(“%d”, &n); for(int i=0; ix = i; new->y = j; new->next = NULL; head->next = new; bfs(head, n); } } printf(“%d

“, house_cnt); for(int i=0; i house[j+1]){ temp = house[j+1]; house[j+1] = house[j]; house[j] = temp; } } } for(int i=0; inext; while(head->next != NULL){ temp = head->next; for(int i=0; i<4; i++){ X = temp->x + x[i]; Y = temp->y + y[i]; if( X<0 || X>=n || Y<0 || Y>=n) continue; if(visit[X][Y] == 1 || map[X][Y] == ‘0’) continue; visit[X][Y] = 1; new = (struct Node*)malloc(sizeof(struct Node)); new->x = X; new->y = Y; new->next = NULL; use->next = new; use = use->next; space++; } head->next = temp->next; free(temp); } house[house_cnt] = space; house_cnt++; }

728×90

[알고리즘] 백준 2667번: 단지번호붙이기 (c언어)

728×90

출처: https://www.acmicpc.net/problem/2667

출처: https://www.acmicpc.net/problem/2667

이 문제는 dfs방식을 이용해서 풀었다.

#define _CRT_SECURE_NO_WARNINGS #include char graph[25][25]; int house[625] = { 0, }; int sorted[625]; int dfs(int i, int j, int n, int cnt) { //한번 집이 있는 것(1)을 확인했다면 0으로 바꾸어주기 graph[i][j] = 0; //하나의 단지에 있는 집의 개수 세기 house[cnt]++; //좌우 위아래로 집이 있으면 같은 단지이기 때문에 재귀로 dfs호출 if (i – 1 >= 0 && graph[i – 1][j] == ‘1’) dfs(i – 1, j, n, cnt); if (i + 1 < n && graph[i + 1][j] == '1') dfs(i + 1, j, n, cnt); if (j - 1 >= 0 && graph[i][j – 1] == ‘1’) dfs(i, j – 1, n, cnt); if (j + 1 < n && graph[i][j + 1] == '1') dfs(i, j + 1, n, cnt); //좌우 위아래로 집이 더이상 없으면 재귀함수 종료 return 0; } //합병정렬 void merge(int list[], int left, int mid, int right) { int i, j, k, l; i = left; j = mid + 1; k = left; while (i <= mid && j <= right) { if (list[i] <= list[j]) sorted[k++] = list[i++]; else sorted[k++] = list[j++]; } if (i > mid) { for (l = j; l <= right; l++) sorted[k++] = list[l]; } else { for (l = i; l <= mid; l++) sorted[k++] = list[l]; } for (l = left; l <= right; l++) { list[l] = sorted[l]; } } void merge_sort(int list[], int left, int right) { int mid; if (left < right) { mid = (left + right) / 2; merge_sort(list, left, mid); merge_sort(list, mid + 1, right); merge(list, left, mid, right); } } int main() { int n; int cnt = 0; //지도 크기 입력받기 scanf("%d", &n); //집이 있는지(1) 없는지(0) 입력받기 for (int i = 0; i < n; i++) { scanf("%s", graph[i]); } //지도를 돌면서 집이 있으면(1) dfs로 지도 순회하기 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (graph[i][j] == '1') { dfs(i, j, n, cnt); //단지 개수 세기 cnt++; } } } printf("%d ", cnt); //오름차순으로 집 개수 정렬 merge_sort(house, 0, cnt - 1); for (int i = 0; i < cnt; i++) printf("%d ", house[i]); return 0; } 728x90

c언어 2667번 단지번호붙이기 (백준)

반응형

#include int sum = 0; //dfs에서 몇개인지를 담는 변수 int n; //n*n int map[26][26] = {0}; //처음 0 또는 1을 입력받음 int check[26][26] = {0}; //이미확인 했는지 안 했는지 int dfs(int i, int j) //depth first search { if(map[i][j] == 1 && check[i][j] == 0) //1이고, 확인 안 한 것일 때 { sum++; check[i][j]++; if(j > 0) dfs(i, j-1); //왼쪽으로 if(j < n-1) dfs(i, j+1); //오른쪽으로 if(i > 0) dfs(i-1, j); //위로 if(i < n-1) dfs(i+1, j); //아래로 } } int main(void) { int ans[314] = {0}; //dfs에서 구한 sum값을 저장 int cnt = 0; //sum값이 1이상으로 마무리 될 때마다 증가 scanf("%d", &n); for(int i = 0; i 0) { ans[cnt++] = sum; } sum = 0; } } //shell sort : 오름차순 int i, j; int gap = n/2; int key = 0; while(1) { if(gap % 2 == 0) gap++; for(i = gap; i=0; j-=gap) { if(key < ans[j]) ans[j+gap] = ans[j]; else break; } ans[j+gap] = key; } if(gap == 1) break; gap /= 2; } printf("%d ", cnt); //단지 개수 for(int i = 0; i

[백준(BOJ)] 2667번 : 단지번호붙이기

반응형

https://www.acmicpc.net/problem/2667

⊙ 문제

⊙ 입력

⊙ 출력

⊙ 예제 입출력

⊙ 알고리즘 분류

그래프 이론

그래프 탐색

너비 우선 탐색

깊이 우선 탐색

⊙ 문제 접근 과정

BFS나 DFS 둘 중 아무거나 사용해도 상관없다. 이번 문제에서 퉁이리는 BFS를 이용해 풀었다.

BFS로 count 값을 올려주었다. 단지가 끝나면 count 값을 result vector에 넣어준다.

그리고 이중 for문이 모두 끝나면 result vector 안에는 단지 수가 들어있다.

sort() 함수를 통해 오름차순 정렬을 한 후 size()함수로 개수를 출력하고

차례대로 for문을 통해 result 원소 값을 출력한다.

⊙ 문제 풀이

#include #include #include using namespace std; #define MAX 26 int n,cnt=0; string arr[MAX]; bool visited[MAX][MAX]={0,}; int dx[4] = {1, -1, 0, 0}; int dy[4] = {0, 0, 1, -1}; vector result; queue> q; void bfs(int x,int y) { q.push({x,y}); visited[x][y]=true; cnt++; while(!q.empty()) { int a = q.front().first; int b = q.front().second; q.pop(); for(int i=0;i<4;i++) { int nx = a + dx[i]; int ny = b + dy[i]; if(0<=nx && 0<=ny && nx > n; for(int i=0;i>arr[i]; for (int i=0;i

DFS] 2667 : 단지번호붙이기

#include #include int arr[30][30]={0,}; int visited[30][30]={0,}; int index=0; int count[500]={0}; void dfs(int i,int k){ //printf(“i=%d k=%d index=%d count[index]=%d

“,i,k,index,count[index]); visited[i][k]=1; count[index]++; if(arr[i][k-1]==1&&visited[i][k-1]==0) dfs(i,k-1); if(arr[i][k+1]==1&&visited[i][k+1]==0) dfs(i,k+1); if(arr[i-1][k]==1&&visited[i-1][k]==0) dfs(i-1,k); if(arr[i+1][k]==1&&visited[i+1][k]==0) dfs(i+1,k); } int compare(const void *a, const void *b) // 오름차순 비교 함수 구현 { int num1 = *(int *)a; // void 포인터를 int 포인터로 변환한 뒤 역참조하여 값을 가져옴 int num2 = *(int *)b; // void 포인터를 int 포인터로 변환한 뒤 역참조하여 값을 가져옴 if (num1 < num2) // a가 b보다 작을 때는 return -1; // -1 반환 if (num1 > num2) // a가 b보다 클 때는 return 1; // 1 반환 return 0; // a와 b가 같을 때는 0 반환 } int main(void){ int n; char ch; scanf(“%d “,&n); for(int i=1;i<=n;i++){ for(int k=1;k<=n;k++){ ch=getchar(); arr[i][k]=ch-48; } getchar(); } for(int i=1;i<=n;i++){ for(int k=1;k<=n;k++){ if(arr[i][k]==1&&visited[i][k]==0){ dfs(i,k); index++; } } } qsort(count,index,sizeof(int),compare); printf("%d ",index); for(int i=0;i

[백준 2667] 단지번호붙이기 C++

2667번: 단지번호붙이기

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여

www.acmicpc.net

키워드에 대한 정보 백준 2667 c++

다음은 Bing에서 백준 2667 c++ 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 백준2667 단지번호붙이기 – DFS 풀이

  • 동영상
  • 공유
  • 카메라폰
  • 동영상폰
  • 무료
  • 올리기

백준2667 #단지번호붙이기 #- #DFS #풀이


YouTube에서 백준 2667 c++ 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 백준2667 단지번호붙이기 – DFS 풀이 | 백준 2667 c++, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

See also  돼지 고기 두루 치기 황금 레시피 | [제육볶음] 이 영상을 본다면 앞으로 당신의 대표요리는 '제육볶음' / 돼지고기요리, 두루치기 Stir-Fried Spicy Pork 20710 좋은 평가 이 답변

Leave a Comment