[백준] 2573번, 빙산 (Python)

2021. 7. 21. 16:15·알고리즘/백준
728x90
반응형

문제

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

 

2573번: 빙산

첫 줄에는 이차원 배열의 행의 개수와 열의 개수를 나타내는 두 정수 N과 M이 한 개의 빈칸을 사이에 두고 주어진다. N과 M은 3 이상 300 이하이다. 그 다음 N개의 줄에는 각 줄마다 배열의 각 행을

www.acmicpc.net

 

코드

import collections

n, m = map(int, input().split())
graph = [list(map(int,input().split())) for _ in range(n)]
dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]
queue = collections.deque()
day = 0
check = False

def bfs(a,b):
    queue.append((a,b))
    while queue:
        x,y = queue.popleft()
        visited[x][y] = True
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 <= nx < n and 0 <= ny < m:
                if graph[nx][ny] != 0 and visited[nx][ny] == False:
                    visited[nx][ny] = True
                    queue.append((nx,ny))
                elif graph[nx][ny] == 0:
                    count[x][y] += 1
    return 1

# 빙산이 분리될때까지 돌아줌
while True:
    visited = [[False]*m for _ in range(n)]
    count = [[0]*m for _ in range(n)]
    result = []
    for i in range(n):
        for j in range(m):
            if graph[i][j] != 0 and visited[i][j] == False:
                result.append(bfs(i,j))
    # 빙산을 깍아줌           
    for i in range(n):
        for j in range(m):
            graph[i][j] -= count[i][j]
            if graph[i][j] < 0:
                graph[i][j] = 0
    
    if len(result) == 0: # 빙산이 다없어질때까지 분리가 되지않으면 break
        break
    if len(result) >= 2: # 빙산이 분리되면 break
        check = True
        break
    day += 1

if check:        
    print(day)
else:
    print(0)

빙산은 근처에 물에 개수에 영향을 받아 빙산이 깍인다. 그래서 bfs를 돌때 elif에 주변이 0일 경우 count 리스트에 +1을 해줘서 저장해준다.

 

graph에 바로 반영을 하게 되면 주변 빙산에 영향이 있기 때문에 따로 저장해뒀다가 한번에 빙산을 깍아줘야한다.

 

bfs가 한번만 실행된다면 섬이 아직 분리가 되지 않았고 2번이상 실행된다면 분리가 되었다는 것이다.

bfs 리턴값을 result에 append시켜 result 길이 bfs 실행 횟수를 알 수 있다.

 

while문으로 섬이 분리될때 까지 돌아준다.

 

 

python3로 제출하면 시간초과가 떠서 pypy로 제출하였습니다.

반응형
저작자표시 (새창열림)

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 10815번, 숫자 카드 (Python)  (0) 2021.07.27
[백준] 1162번, 도로포장 (Python)  (0) 2021.07.22
[백준] 11725번, 트리의 부모 찾기 (Python)  (0) 2021.07.21
[백준] 11403번, 경로 찾기 (Python)  (0) 2021.07.21
[백준] 15900번, 나무 탈출 (Python)  (0) 2021.07.21
'알고리즘/백준' 카테고리의 다른 글
  • [백준] 10815번, 숫자 카드 (Python)
  • [백준] 1162번, 도로포장 (Python)
  • [백준] 11725번, 트리의 부모 찾기 (Python)
  • [백준] 11403번, 경로 찾기 (Python)
wookcode
wookcode
공부한 내용들을 정리하고 기록하는 블로그입니다.
    반응형
  • wookcode
    wookcode
    wookcode
  • 전체
    오늘
    어제
    • 카테고리 (196) N
      • study (1) N
        • 아파치 카프카 애플리케이션 프로그래밍 with 자.. (0)
        • 인프런 (1) N
      • Live Study (15)
      • Programming (14)
        • Java (8)
        • Python (1)
        • Springboot (5)
        • MSA (0)
      • 알고리즘 (117)
        • 백준 (58)
        • 프로그래머스 (59)
      • 에러로그 (5)
      • 항해99 (23)
      • 면접 (1)
      • 프로젝트 (1)
      • CS (19)
        • 네트워크 (2)
        • 운영체제 (2)
        • 데이터베이스 (2)
        • 컴퓨터구조 (1)
        • Java (8)
        • Spring (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    조합
    미니프로젝트
    후기
    java
    해결
    브루트포스
    인프런
    알고리즘
    항해마켓
    정리
    SpringBoot
    코딩테스트
    jpa
    spring
    SFlash
    카카오코딩테스트
    그리디
    orm
    항해99
    파이썬
    에러
    백준
    스파르타코딩클럽
    프로그래머스
    회고
    버그
    카카오인턴
    실전프로젝트
    괄호
    김영한
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
wookcode
[백준] 2573번, 빙산 (Python)
상단으로

티스토리툴바