땅지원
땅지원's Personal blog
땅지원
전체 방문자
오늘
어제
  • 전체 (353)
    • Frontend (2)
      • React (2)
    • Backend (90)
      • Java (16)
      • Python (19)
      • Spring (23)
      • Database (21)
      • Troubleshooting (8)
    • DevOps (27)
      • ELK (13)
    • CS (40)
    • OS (2)
      • Linux (2)
    • Algorithm (95)
      • concept (18)
      • Algorithm Problem (77)
    • 인공지능 (25)
      • 인공지능 (12)
      • 연구노트 (13)
    • 수업정리 (35)
      • 임베디드 시스템 (10)
      • 데이터통신 (17)
      • Linux (8)
    • 한국정보통신학회 (5)
      • 학술대회 (4)
      • 논문지 (1)
    • 수상기록 (8)
      • 수상기록 (6)
      • 특허 (2)
    • 삼성 청년 SW 아카데미 (6)
    • 42seoul (12)
    • Toy project (3)
    • 땅's 낙서장 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 20.11.6 BB21플러스 온라인 학술대회
  • 20.10.30 한국정보통신학회 온라인 학술대회

인기 글

태그

  • 이것이 리눅스다 with Rocky Linux9
  • ㅗ
  • E
  • I
  • D

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
땅지원

땅지원's Personal blog

Algorithm/Algorithm Problem

백준 2667 단지번호붙이기(BFS, DFS)

2022. 3. 6. 15:46

 

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

 

2667번: 단지번호붙이기

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

www.acmicpc.net

문제를 보면 그래프 문제라는걸 바로 알 수 있고 dfs, bfs로 풀어야함을 알 수 있다.

 

0으로 구분되어져 있는 단지는 몇개인지 모르기 때문에 처음 1을 찾아줘서 거기서 탐색을 진행해 0으로 만들어주면

 

다음 단지를 찾을 때 방금 탐색했던 단지는 고려하지 않아도 됨을 알 수 있다.

 

BFS 이용

from collections import deque

def bfs(x, y):
    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]

    queue = deque()
    queue.append((x, y))
    board[x][y] = 0
    res = 1
    while queue:
        x, y = queue.popleft()

        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]

            if nx < 0 or nx >= n or ny < 0 or ny >= n:
                continue

            if board[nx][ny] == 1:
                board[nx][ny] = 0
                queue.append((nx, ny))
                res += 1
    return res

n = int(input())

board = []
data = []
for _ in range(n):
    board.append(list(map(int,input())))
for i in range(n):
    for j in range(n):
        if board[i][j] == 1:
            data.append(bfs(i, j))
data.sort()

print(len(data))
for i in range(len(data)):
    print(data[i])

DFS 이용

def dfs(x,y):
    if x < 0 or x >= n or y < 0 or y >= n:
        return False
    global res
    dx = [-1, 1, 0, 0]
    dy = [0, 0, 1, -1]

    if board[x][y] == 1:
        res += 1
        board[x][y] = 0
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            dfs(nx,ny)
        return 1
    return 0

n = int(input())

board = []
data = []
for _ in range(n):
    board.append(list(map(int,input())))

res = 0
for i in range(n):
    for j in range(n):
        if board[i][j] == 1:
            if dfs(i,j) == 1:
                data.append(res)
                res = 0

print(len(data))
data.sort()
for i in data:
    print(i)

 

'Algorithm > Algorithm Problem' 카테고리의 다른 글

백준 1764 듣보잡(set() 자료형)  (0) 2022.03.26
백준 1780 종이의 개수  (0) 2022.03.06
백준 18111 마인크래프트  (0) 2022.02.17
백준 1213 & 팰린드롬 알고리즘(Palindrome Algorithm)  (0) 2022.02.17
백준 1251 단어 나누기  (0) 2022.02.17
    'Algorithm/Algorithm Problem' 카테고리의 다른 글
    • 백준 1764 듣보잡(set() 자료형)
    • 백준 1780 종이의 개수
    • 백준 18111 마인크래프트
    • 백준 1213 & 팰린드롬 알고리즘(Palindrome Algorithm)
    땅지원
    땅지원
    신입 개발자의 우당탕탕 기술 블로그

    티스토리툴바