Study/BOJ

[BOJ] 1113. 수영장 만들기

MuviSsum 2020. 10. 19. 21:30

백준 문제 주소:

www.acmicpc.net/problem/1113

 

1113번: 수영장 만들기

지민이는 수영장을 만들려고 한다. 수영장을 만들 곳의 크기는 N*M이고, 각 칸은 직육면체이다. 따라서, 각 칸의 직육면체의 높이가 쓰여 있는 다음과 같은 땅을 생각할 수 있다. 16661 61116 16661 이

www.acmicpc.net

 

문제 : 주어진 수영장들의 영역(부피)를 구하라.

 

풀이 :

1. DFS / BFS 둘 다 가능한데, BFS가 좀 더 편하게 풀리는 것 같습니다.

2. 수영장 땅의 최대 높이는 9이니까 1~8까지 높이대로 영역(부피)를 구하여 결과값에 각각 저장해줍니다.

3. 수영장 한 곳을 찝어서 BFS/DFS를 돌릴 때, 수영장 밖으로 나가면 거기는 수영장이 아니고, 그 안에서만 돌면 수영장이라고 생각하면 됩니다.

4. 즉, 1~8까지 높이대로 BFS/DFS를 돌릴 때, 선택한 높이보다 높이가 낮거나 같다면 이동가능하고 높이가 높다면 이동 불가능한 곳입니다. 이동하며 높은 숫자로 막혀있으면 수영장, 수영장을 벗어난다면 수영장이 아닌 곳입니다.

 

 처음에 어렵게 생각해서 최대 숫자를 보면서 벽을 먼저 구한 다음 안의 넓이를 구할까 라고 생각했지만, 반대로 작은 수부터 차곡차곡 쌓아가는 형식을 생각하니 쉽게 풀렸습니다.

 

코드 :

from collections import deque
import sys

visited = []
res = 0

def solution():
    global res, visited

    def bfs(x, y, n):
        global res, visited
        Q = deque([(x, y)])
        tmp = [(x,y)]
        sig = True
        visited[x][y] = 1
        cnt = 1
        while True:
            x, y = Q.popleft()
            for _ in range(4):
                rx = x + dx[_]
                ry = y + dy[_]
                if rx == -1 or rx == N or ry == -1 or ry == M:
                    sig = False
                    continue
                if board[rx][ry] <= n and visited[rx][ry] == 0:
                    visited[rx][ry] = 1
                    Q.append((rx, ry))
                    cnt += 1
            if not Q:
                if sig:
                    res += cnt
                return


    N, M = map(int, input().split())
    board = [list(map(int, list(sys.stdin.readline().rstrip()))) for _ in range(N)]
    dx = [-1, 0, 0, 1]
    dy = [0, -1, 1, 0]
    for num in range(1, 9):
        visited = [[0] * M for _ in range(N)]
        for i in range(N):
            for j in range(M):
                if board[i][j] <= num and visited[i][j] == 0:
                    bfs(i, j, num)
    print(res)
solution()

 

추가 :

테스트 케이스 / 반례 모음

txegg.tistory.com/117

 

[BOJ] 1113. 수영장 만들기 반례 / 테스트 케이스

백준 문제 주소: www.acmicpc.net/problem/1113 1113번: 수영장 만들기 지민이는 수영장을 만들려고 한다. 수영장을 만들 곳의 크기는 N*M이고, 각 칸은 직육면체이다. 따라서, 각 칸의 직육면체의 높이가 ��

txegg.tistory.com

 

반응형

'Study > BOJ' 카테고리의 다른 글

[BOJ] 1365. 꼬인 전깃줄  (0) 2020.11.04
[BOJ] 1113. 수영장 만들기 반례 / 테스트 케이스  (0) 2020.10.19
[BOJ] 17070. 파이프 옮기기 1  (0) 2020.10.14
[BOJ] 16236. 아기상어  (0) 2020.10.07
[BOJ] 2064. IP 주소  (1) 2020.09.17