킹의 개발일지

바닥 장식(백준 1338번) 본문

문제풀이

바닥 장식(백준 1338번)

k1ng 2022. 11. 17. 19:44

바닥 장식

1388번: 바닥 장식

 

1388번: 바닥 장식

형택이는 건축가이다. 지금 막 형택이는 형택이의 남자 친구 기훈이의 집을 막 완성시켰다. 형택이는 기훈이 방의 바닥 장식을 디자인했고, 이제 몇 개의 나무 판자가 필요한지 궁금해졌다. 나

www.acmicpc.net

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

 

다음과 같이 입력이 주어진다면 4개의 길이 판자가 4개가 있음으로 4를 출력해준다.

4 4
----
----
----
----

다음 예시는 13을 출력해주면 된다.

7 8
--------
|------|
||----||
|||--|||
||----||
|------|
--------

문제 해결

내가 접근한 방법의 경우 2중 for 루프를 돌면서 입력값 하나 하나 들어가서 bfs를 해준다. bfs를 완료하고 나면 방문한 정점들은 visited 체크 돼있음으로 다시 방문하지 않는다.

for i in range(n):
    for j in range(m):
        if not visited[i][j]:
            visited[i][j] = True
            bfs(i, j)

만약 i, j의 값이 ‘-’ 일경우 열 방향으로 인접한 정점만을 탐색하면서 카운트를 올린다. 만약 ‘|’ 라면 행 방향으로 인접한 정점을 탐색 하면서 카운트를 올린다.

 

‘-’로 탐색을 시작했다면 ‘|’를 만나면 탐색이 종료되고, ‘|’ 로 시작했다면 ‘-’를 만나면 길이를 반환하고 탐색을 종료한다.

 

그리고 열, 행 방향으로만 탐색하기 위해서 방향 벡터를 1, -1 로만 두 요소만 주었다.

 

코드

# 바닥 장식
import sys
from collections import deque

n, m = map(int, sys.stdin.readline().split())
graph = []
dx = [1,-1]
dy = [1,-1]
visited = [[False for _ in range(m)] for _ in range(n)]
q = deque()

for i in range(n):
    graph.append(list(sys.stdin.readline().rstrip()))
cnt = 0

def bfs(x, y):
    global cnt
    tree = graph[x][y]
    q.append((x,y))
    if tree == '-':
        while q:
            cx, cy = q.popleft()
            for dir in range(2):
                # 열 방향으로만 탐색
                nx = cx
                ny = dy[dir] + cy
                if 0 <= nx < n and  0 <= ny < m:
                    if graph[nx][ny] == '|':
                        break
                    if not visited[nx][ny]:
                        visited[nx][ny] = True
                        q.append((nx,ny))
        cnt += 1
        
    elif tree == '|':
        while q:
            cx, cy = q.popleft()
            for dir in range(2):
                # 행 방향으로만 탐색
                nx = dx[dir] + cx
                ny = cy
                if 0 <= nx < n and  0 <= ny < m:
                    if graph[nx][ny] == '-':
                        break
                    if not visited[nx][ny]:
                        visited[nx][ny] = True
                        q.append((nx,ny))
        cnt += 1        
       
for i in range(n):
    for j in range(m):
        if not visited[i][j]:
            visited[i][j] = True
            bfs(i, j)

print(cnt)

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

최장 공통 부분 서열 문제 (LCS)  (0) 2022.11.22
배낭문제(knapsack problem)  (1) 2022.11.22
경쟁적 전염(백준 18405번)  (1) 2022.11.17
무한 이진 트리 (백준 2078번)  (0) 2022.11.17
백준 1406번: 에디터  (0) 2022.07.16