[백준] 1388번 : 바닥장식

Laska·2025년 4월 3일
post-thumbnail

문제

형택이는 건축가이다. 지금 막 형택이는 형택이의 남자 친구 기훈이의 집을 막 완성시켰다. 형택이는 기훈이 방의 바닥 장식을 디자인했고, 이제 몇 개의 나무 판자가 필요한지 궁금해졌다. 나무 판자는 크기 1의 너비를 가졌고, 양수의 길이를 가지고 있다. 기훈이 방은 직사각형 모양이고, 방 안에는 벽과 평행한 모양의 정사각형으로 나누어져 있다.

이제 ‘-’와 ‘|’로 이루어진 바닥 장식 모양이 주어진다. 만약 두 개의 ‘-’가 인접해 있고, 같은 행에 있다면, 두 개는 같은 나무 판자이고, 두 개의 ‘|’가 인접해 있고, 같은 열에 있다면, 두 개는 같은 나무 판자이다.

기훈이의 방 바닥을 장식하는데 필요한 나무 판자의 개수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 방 바닥의 세로 크기N과 가로 크기 M이 주어진다. 둘째 줄부터 N개의 줄에 M개의 문자가 주어진다. 이것은 바닥 장식 모양이고, '-‘와 ’|‘로만 이루어져 있다. N과 M은 50 이하인 자연수이다.

출력
첫째 줄에 문제의 정답을 출력한다.





풀이

계속 bfs, dfs만 써야한다는 생각에 사로잡혀서.. 선형으로 그래프를 탐색하며, 함수를 뿌릴 생각은 하지 못했다..

해당 열과 행을 선형으로 탐색하며 방문하지 않았다면, dfs를 통해 이어져있는 노드를 계속해서 탐색하는 식으로 재귀를 구성했다. 이때 탐색이 끝난다면 타일 하나의 개수를 늘려주는 식으로하였다.

코드

import sys
sys.setrecursionlimit(10000)  # DFS 사용 시 깊이 제한 해제
input = sys.stdin.readline

n, m = map(int, input().split())
graph = [list(input().strip()) for _ in range(n)]
visited = [[False] * m for _ in range(n)]

def dfs(x, y):
    visited[x][y] = True
    if graph[x][y] == '-':
        ny = y + 1
        if ny < m and graph[x][ny] == '-' and not visited[x][ny]:
            dfs(x, ny)
    elif graph[x][y] == '|':
        nx = x + 1
        if nx < n and graph[nx][y] == '|' and not visited[nx][y]:
            dfs(nx, y)

count = 0
for i in range(n):
    for j in range(m):
        if not visited[i][j]:
            dfs(i, j)
            count += 1

print(count)
profile
똑똑해지고 싶어요

0개의 댓글