갬쿠
개미 개발
갬쿠
전체 방문자
오늘
어제
  • ALL (137)
    • React (20)
    • JS & CSS & HTML (29)
    • Algorithm (62)
    • 웹 보안 (11)
    • 달리는 까까: 쿠키런 팬게임 (10)
    • Python (0)
    • 기타 (5)
    • 비공개 플젝 (0)

블로그 메뉴

  • GitHub
  • 방명록
  • 관리자 메뉴

공지사항

인기 글

태그

  • useReducer
  • 리액트
  • Python
  • HTML
  • Object
  • JavaScript
  • node.js
  • EventListener
  • REACT
  • 게임
  • 쿠키런
  • Programmers
  • 쿠키런 모작
  • Baekjoon
  • 쿠키런 팬게임
  • CSS
  • 백준
  • Best of the Best
  • useEffect
  • useState
  • SQL Injection
  • transform
  • 객체
  • js
  • BEAKJOON
  • 게임 개발
  • 달리는 까까
  • 크롬 공룡게임
  • 크롬 공룡 게임
  • 모의 해킹

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
갬쿠

개미 개발

[2667] 단지번호붙이기 - Python
Algorithm

[2667] 단지번호붙이기 - Python

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

각 집들을 하나의 노드로 보고 상하좌우로 연결된 간선이 있다고 생각하면 지도는 하나의 그래프가 된다. 모든 노드를 순회하며 인접한 노드가 총 몇 개인지를 세는 과정을 반복하면 된다.

 

# 정답 코드

import sys
sys.setrecursionlimit(10**9)
input = sys.stdin.readline

def dfs(graph, x, y, visited):
    global n
    global cnt
    visited[x][y] = True
    cnt += 1
    # 인접 노드(상하좌우) 재귀 호출
    if x > 0:
        if not visited[x-1][y]:
            dfs(graph, x-1, y, visited)
    if y > 0:
        if not visited[x][y-1]:
            dfs(graph, x, y-1, visited)
    if x < n - 1:
        if not visited[x+1][y]:
                dfs(graph, x+1, y, visited)
    if y < n -1:
        if not visited[x][y+1]:
                dfs(graph, x, y+1, visited)

def int_to_bool(n):
    if n == '0':
        return True
    else:
        return False

n = int(input())
my_map = []
visited = []
for _ in range(n):
    tem = list(input().strip())
    my_map.append(tem)
    visited.append(list(map(int_to_bool, tem)))

res = []
cnt = 0
for i in range(n):
    for j in range(n):
        if not visited[i][j]:
            dfs(my_map, i, j, visited)
            res.append(cnt)
            cnt = 0

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

두 개의 이차원 리스트를 만들었다. my_map에는 특정 위치에 집이 있는지 없는지를, visited에는 특정 위치를 검사 했는지 안했는지를 저장한다. vsited는 지도를 입력 받을 때 집이 없는 위치에는 True를 저장하고 있는 위치에는 False를 저장하도록 했다. 이렇게 하먄 dfs 함수에서 집이 없는 위치를 이미 검사했다고 판단하여 접근하지 않으므로 자연스럽게 집이 있는 위치만 탐색하게 된다.

visited의 모든 요소를 돌며 False인 경우(아직 탐색하지 않은 위치) dfs함수를 호출하는데, 이 때 cnt의 값을 0으로 초기화해 새로 만들어진 단지의 집 수를 카운트한다. 한 위치의 visited 값이 False여서 dfs가 호출되고 나면 그 위치에 인접한 모든 집들의 visited 값은 True로 바뀌어 dfs를 호출하지 않는다.

728x90

'Algorithm' 카테고리의 다른 글

[2178] 미로 탐색 - Python  (0) 2023.02.17
[1012] 유기농 배추 - Python  (0) 2023.02.17
[1260] DFS와 BFS - Python  (0) 2023.02.16
[2606] 바이러스 - Python  (0) 2023.02.16
[24444] 알고리즘 수업 - 너비 우선 탐색 1 - Python  (0) 2023.02.16
    'Algorithm' 카테고리의 다른 글
    • [2178] 미로 탐색 - Python
    • [1012] 유기농 배추 - Python
    • [1260] DFS와 BFS - Python
    • [2606] 바이러스 - Python
    갬쿠
    갬쿠
    보안&소프트웨어 전공 프론트엔드 개발자

    티스토리툴바