김호쭈
DevForYou
김호쭈
전체 방문자
오늘
어제
  • 분류 전체보기 (321)
    • • 데이터베이스(DB) (9)
      • __SQL__ (9)
    • •알고리즘(Algorithm ) (117)
      • 문제풀이 (99)
      • 스터디 (14)
      • 알고리즘 팁 (4)
    • •Compter Science (57)
      • Operating System (25)
      • Computer Network (1)
      • Computer Vision (16)
      • Artificial Intelligence (14)
      • Software Technology (1)
    • • 독서 (36)
      • Design Pattern (24)
      • 객체지향의 사실과 오해 (1)
      • Object Oriented Software En.. (11)
    • • 개발 (26)
      • React (3)
      • node.js (6)
      • Django (11)
      • Spring boot (6)
    • • 개발Tip (4)
      • GitHub (0)
    • •프로젝트 (2)
      • 물물 (2)
    • •App (54)
      • 안드로이드 with Kotlin (50)
      • 코틀린(Kotiln) (4)
    • •회고 (8)
    • •취준일기 (3)
    • • 기타 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 로컬저장소
  • local저장소
  • ㄱ
  • 깃허브데스크탑
  • Remote저장소
  • KMU_WINK
  • GitHubDesktop
  • 원격저장소

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김호쭈

DevForYou

•알고리즘(Algorithm )/문제풀이

[백준2468&파이썬] BFS를 사용할때 탐색 단위에 대한 생각이 필요하다.

2023. 4. 8. 10:31

# 문제

백준 2468 안전 영역 파이썬 풀이

 

2468번: 안전 영역

재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는

www.acmicpc.net

# 코드

import copy
import sys
from collections import deque

N = int(sys.stdin.readline())

board = list()
for _ in range(N) :
  line = list(map(int,sys.stdin.readline().split()))
  board.append(line)

dirs = [
  (-1,0),(0,1),(1,0),(0,-1)
  ]

maxCount = 0
for tick in range(1,101) :
  mBoard = copy.deepcopy(board)

  # 일단 안전영역 구하기
  for i in range(len(mBoard)) :
    for j in range(len(mBoard[i])) :
      if mBoard[i][j] <= tick :
        board[i][j] = -1 # 잠긴 곳임, 방문표시

  # 안전영역의 개수 세기
  cnt = 0
  for i in range(len(mBoard)) :
    for j in range(len(mBoard[i])) :
      if mBoard[i][j] == -1 :
        continue # 방문한 곳 또는 이미 잠긴 곳이면

      cnt +=1
      dq = deque()
      dq.append((i,j)) # 현재 위치 넣기
      mBoard[i][j]  # 현재 위치 방문 처리

      while len(dq) != 0 :
        cur = dq.popleft()

        for dir in dirs :
          next = (cur[0] + dir[0], cur[1] + dir[1])

          if 0 <= next[0] < N and 0 <= next[1] < N : # 범위 안이고
            if mBoard[next[0]][next[1]] != -1 : # 방문했던곳이 아니면
              # 방문처리
              mBoard[next[0]][next[1]] = -1
              dq.append(next)
  maxCount = max(maxCount,cnt)

print(maxCount)

# 풀이

## 깊은 복사를 사용하는 방법

 

[python] 파이썬 얕은복사, 깊은복사 (copy, deepcopy, [:], =) 총 정리

안녕하세요. BlockDMask입니다. 오늘은 파이썬 얕은 복사, 깊은 복사에 대해서 정리해보려 합니다. 은근히 헷갈려서 천천히 한번 정리해볼게요. 1. 파이썬 얕은 복사 2. 파이썬 깊은 복사 3. 그림으로

blockdmask.tistory.com

import copy

mBoard = copy.deepcopy(board)
  • 깊은 복사와 얕은 복사의 개념을 안다면, 깊은 복사를 사용해야지 추후에 생각할 건덕지가 사라진다. 물론 immutable한 int와 같은건 별문제 없겠지만 2차원배열을 썻기 때문에 깊은 복사가 필요하다.

 

## 탐색의 단위를 잘 생각해보면 쉽다

  • BFS를 어떤 단위로 끊어서 생각하느냐에 따라서 문제를 쉽게 생각할 수 있다.
  • BFS를 처음 공부했던 시기에는 이 생각하는 힘이 약해서 쉬운문제도 엄청 깊게 생각하거나 어렵게 겨우 구현해냈다. BFS를 쉽게 푸려면 그 탐색 단위를 어떻게 끝는지가 중요한거 같다.
  • 이 문제에서는 두번단위로 끝어서 생각해야 한다. 
  • 일단 안전영역이 가장 많이 생길때의 그 갯수를 구해야 한다. 비는 1~100까지 올 수 있기 때문에 여기서 한번 단위를 끊는다. 
  • 그리고 나서 안전영역을 마킹한다. (난 비안전영역을 마킹했다, 즉 비 안전영역을 방문처리 했다.)
maxCount = 0
for tick in range(1,101) :
  mBoard = copy.deepcopy(board)

  # 일단 안전영역 구하기
  for i in range(len(mBoard)) :
    for j in range(len(mBoard[i])) :
      if mBoard[i][j] <= tick :
        board[i][j] = -1 # 잠긴 곳임, 방문표시
        
  # 이제 이 아래서부터 BFS를 돌린다.
  pass

 

  • 첫번째로 끊었다면 이제 두번째로 끊을 차례다.
  • 요즘 문제를 풀때는 한 탐색 단위로 deque를 만들어서 끊어 사용한다. 옛날에는 이 생각을 못해서 문제를 복잡하게 풀어버리곤 했었다. 하나의 탐색 시작점을 통하여 탐색이 끝났다면, 다시 큐를 만들어 처음부터 반복한다. 이 과정을 계속해서 전체에 대한 탐색을 마친다.

 

## 방문처리를 위한 visit배열을 항상 만들 필요는 없는거 같다.

이건 전에도 적었었다. 입력받아 표기한 board에 그대로 활용할 수 있다면 그냥 활용해도 될 듯 하다. 굳이 방문처리를 위한 visit를 만들어 메모리를 낭비하지 말자.  상황에 맞게 잘 활용하자.

저작자표시 (새창열림)

'•알고리즘(Algorithm ) > 문제풀이' 카테고리의 다른 글

[백준2206&파이썬] BFS에서 이동상태가 분리된다면 방문 확인도 분리시켜야 한다.  (0) 2023.04.10
[백준6593&파이썬] BFS로 3차원 공간을 탐색할 수 있다.  (0) 2023.04.09
[백준5014&파이썬] BFS은 1차원에서도 최단거리를 구할 수 있다.  (0) 2023.04.08
[백준2583&파이썬] 좌표평면을 배열로 표현하는 방법  (0) 2023.04.06
[백준7562&파이썬] BFS를 활용하여 최단거리에 도달하는 방법  (0) 2023.04.05
    '•알고리즘(Algorithm )/문제풀이' 카테고리의 다른 글
    • [백준2206&파이썬] BFS에서 이동상태가 분리된다면 방문 확인도 분리시켜야 한다.
    • [백준6593&파이썬] BFS로 3차원 공간을 탐색할 수 있다.
    • [백준5014&파이썬] BFS은 1차원에서도 최단거리를 구할 수 있다.
    • [백준2583&파이썬] 좌표평면을 배열로 표현하는 방법
    김호쭈
    김호쭈
    공부하고 정리하고 기록하기

    티스토리툴바