[BOJ알고리즘, C++]#2667_단지 번호 붙이기, 그래프 탐색, BFS, scanf 활용

2024. 2. 25. 14:22· 문제 풀이/BOJ 문제 풀이
목차
  1. #1. 문제
  2. #2. 풀이
  3. 1. 그래프 탐색
  4. 2. 입력 코드 작성 주의! 미로 찾기 종류의 문제는 BFS 활용!
  5. #3. 코드

 

#1. 문제

 

2667번: 단지번호붙이기

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

www.acmicpc.net

 


 

#2. 풀이

 

1. 그래프 탐색

 

[자료구조]#6_그래프

#0. 개념 1. 그래프? [정의] : 그래프는 노드와 간선들의 집합으로 이루어진 비 선형 자료구조입니다. 그래프의 노드들은 간선을 통해 연결되어 일종의 네트워크를 형성합니다. 그래프는 노드와

webddevys.tistory.com

 

그래프의 모든 정점을 탐색하는 방법은 두 가지입니다. 먼저, DFS(깊이 우선 탐색)은 출발 정점으로부터 더 이상 확장할 수 없는 단말 노드까지 먼저 탐색하는 방법입니다. DFS는 일반적으로 재귀 호출 혹은 스택을 활용하여 구현합니다. 다음으로, BFS(너비 우선 탐색)은 현재 정점과 인접한 정점들을 우선 탐색하는 방법입니다. BFS는 일반적으로 큐를 활용하여 구현합니다.

 

2. 입력 코드 작성 주의! 미로 찾기 종류의 문제는 BFS 활용!

 

  1. 먼저, 공백 없이 주어지는 숫자 목록은 scanf("%1d", &tmp)로 입력받아야 합니다.
  2. BFS를 수행하여 주어진 2차원 배열 형식의 지도를 탐색하며 각 단지 수를 찾아서 저장합니다.
  3. sort 함수를 활용해 오름차순 정렬하고, 정답을 출력합니다.

 


 

#3. 코드

 

#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <algorithm>
using namespace std;

typedef pair<int, int> p;

int N;
vector<vector<int>> map;
vector<vector<bool>> visited;
vector<int> complex;

int dy[] = {0, 0, -1, 1};
int dx[] = {1, -1, 0, 0};

void bfs(p house)
{
    queue<p> q;
    int cnt = 1;

    q.push(house);
    visited[house.first][house.second] = true;

    while (!q.empty())
    {
        int cy = q.front().first;
        int cx = q.front().second;
        q.pop();

        for (int i = 0; i < 4; ++i)
        {
            int ny = cy + dy[i];
            int nx = cx + dx[i];

            if (ny >= N || ny < 0 || nx >= N || nx < 0 || map[ny][nx] == 0 || visited[ny][nx])
                continue;
            q.push({ny, nx});
            visited[ny][nx] = true;
            cnt++;
        }
    }

    complex.push_back(cnt);
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin >> N;

    map.resize(N, vector<int>(N));
    visited.resize(N, vector<bool>(N, false));

    // 입력 관련 주의 사항 : 공백없이 주어지는 정수 입력은 "%1d"를 활용하는 scanf를 활용합니다.
    for (int i = 0; i < N; ++i)
        for (int j = 0; j < N; ++j)
            scanf("%1d", &map[i][j]);

    for (int i = 0; i < N; ++i)
        for (int j = 0; j < N; ++j)
            if (!visited[i][j] && map[i][j] == 1)
                bfs({i, j});

    sort(begin(complex), end(complex));

    cout << complex.size() << '\n';
    for (int i = 0; i < (int)complex.size(); ++i)
        cout << complex[i] << '\n';

    return 0;
}

 


 

 

 

 

저작자표시 (새창열림)

'문제 풀이 > BOJ 문제 풀이' 카테고리의 다른 글

[BOJ알고리즘, C++]#1012_유기농 배추, 그래프 탐색, BFS, 영역 찾기  (0) 2024.02.26
[BOJ알고리즘, C++]#7576_토마토, 그래프 탐색, BFS  (0) 2024.02.26
[BOJ알고리즘, C++]#1697_숨바꼭질, 그래프 탐색, BFS  (0) 2024.02.21
[BOJ알고리즘, C++]#11724_연결 요소의 개수, 그래프, DFS, 깊이 우선 탐색  (1) 2024.02.21
[BOJ알고리즘, C++]#2468_안전 영역, 그래프 탐색, DFS, BFS, 미로 탐색  (0) 2024.02.21
  1. #1. 문제
  2. #2. 풀이
  3. 1. 그래프 탐색
  4. 2. 입력 코드 작성 주의! 미로 찾기 종류의 문제는 BFS 활용!
  5. #3. 코드
'문제 풀이/BOJ 문제 풀이' 카테고리의 다른 글
  • [BOJ알고리즘, C++]#1012_유기농 배추, 그래프 탐색, BFS, 영역 찾기
  • [BOJ알고리즘, C++]#7576_토마토, 그래프 탐색, BFS
  • [BOJ알고리즘, C++]#1697_숨바꼭질, 그래프 탐색, BFS
  • [BOJ알고리즘, C++]#11724_연결 요소의 개수, 그래프, DFS, 깊이 우선 탐색
Hardii2
Hardii2
Hardii2
개발 블로그
Hardii2
전체
오늘
어제
  • 분류 전체보기
    • 알고리즘
    • 웹 개발
      • Node.js
      • React
    • 게임개발
      • DirectX12
      • 관련 지식
      • Unreal C++
      • Unreal 블루프린트
    • 언어
      • Effective C++
      • Basic C++
      • 디자인 패턴
      • 자료구조
      • 기술 질문
    • 문제 풀이
      • BOJ 문제 풀이
      • Programmers 문제 풀이
      • geeksForgeeks 문제 풀이
    • 수학
      • 확률과 통계
      • 게임수학
    • 개인프로젝트
    • 그룹프로젝트
      • PM
      • Dev
    • Github

블로그 메뉴

  • 홈
  • 글쓰기

공지사항

인기 글

태그

  • 디자인 패턴
  • 기술 질문
  • Effective C++
  • 우선순위 큐
  • DP
  • BOJ
  • 정렬
  • 알고리즘
  • programmers
  • set
  • BFS
  • 트리
  • dfs
  • C++
  • 그래프
  • unreal
  • 개발
  • Unreal Blueprint
  • stl
  • 최단 경로

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
Hardii2
[BOJ알고리즘, C++]#2667_단지 번호 붙이기, 그래프 탐색, BFS, scanf 활용
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.