@Eeap
velog
@Eeap
전체 방문자
오늘
어제
  • 전체 (168)
    • osam (1)
    • Cloud (21)
      • Docker (2)
      • AWS (13)
    • AI & Data (7)
    • Algorithm (76)
      • Baekjoon (75)
      • Codeforces (1)
    • Language (18)
      • Java (18)
    • Back-end (17)
      • Spring (3)
      • JSP & Servlet (12)
      • Go (2)
    • 일상 (4)
    • 기타 (8)
    • git (1)
    • Infra (9)
      • Apache Kafka (5)
      • Kubernetes (4)
      • 기타 (0)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • AWS CodeCatalyst
  • bedrock agent
  • AWS CodeStar
  • AWS CodeArtifact
  • 오블완
  • 인터페이스
  • sagemaker unified studio
  • Python
  • invokemodel api
  • bedrock
  • SageMaker
  • 티스토리챌린지
  • bedrock api
  • flink
  • knowledge bases
  • CLASS
  • converse api
  • java
  • Agent
  • 심폴릭링크

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
@Eeap

velog

Algorithm/Baekjoon

2468번 파이썬

2022. 3. 27. 20:32
반응형

처음에 visited를 append로 추가하는 식으로 방문한 것을 관리했더니 시간소요가 컸다. 다른 사람들을 보니까 visited를 0값을 1로 바꿔주는 방법을 쓰길래 나도 사용해봤더니 시간 초과 에러는 뜨지 않았다!!

이 문제는 간단하게 bfs를 이용해서 풀 수 있다.

높이의 최솟값부터 최댓값까지 잠기는 높이를 for문으로 돌려주면 되고 모든 idx를 검사해서

h보다 크고 방문하지 않는 지점이 있다면 bfs문을 돌려서 그 지점의 최대 영역을 방문 지점에 넣고 cnt를 1증가 시켜준다.

새로운 높이마다 최대 영역이 되는 구간이 달라지기 때문에 visited를 항상 초기화해주어야 하고 

(# visited=[[0]*n]*n 이렇게 작성할 경우 [0]*n이 n번 복사되는 것이므로 한 행의 값이 바뀌면 모든 행의 값이 바뀌므로 아래처럼 작성해줘야한다!!)

높이의 최솟값에서 -1 한 값부터 for문을 돌리는 이유는

모두 물에 잠기지 않는 최대 영역이 경우가 답이 될 수 있기 때문이다(잠기는 높이가 최솟값보다 작을 경우 최대영역은 모든 영역이고 res가 1인 경우다)

import sys
input = sys.stdin.readline
n = int(input())
ary = [list(map(int,input().split())) for i in range(n)]
from collections import deque
dx=[1,-1,0,0]
dy=[0,0,1,-1]
def bfs(row,col,h,visited):
  queue = deque([[row,col]])
  visited[row][col]=1
  while queue:
    item = queue.popleft()
    for i in range(4):
      n_row=item[0]+dx[i]
      n_col=item[1]+dy[i]
      if 0<=n_row<n and 0<=n_col<n and ary[n_row][n_col] > h and not visited[n_row][n_col]:
        queue.append([n_row,n_col])
        visited[n_row][n_col]=1

maxm= max(max(ary))
minm= min(min(ary))
res=-1
for h in range(minm-1,maxm):
  visited = [[0]*n for _ in range(n)]
  cnt = 0
  for r in range(n):
    for c in range(n):
      if ary[r][c] > h and not visited[r][c]:
        bfs(r, c, h,visited)
        cnt += 1
  if cnt > res:
    res = cnt
print(res)
반응형
저작자표시 (새창열림)

'Algorithm > Baekjoon' 카테고리의 다른 글

14503번 파이썬  (0) 2022.03.29
2573번 파이썬  (0) 2022.03.28
2579번 파이썬  (0) 2022.03.26
2108번 파이썬  (0) 2022.03.26
5014번 파이썬  (0) 2022.03.21
    'Algorithm/Baekjoon' 카테고리의 다른 글
    • 14503번 파이썬
    • 2573번 파이썬
    • 2579번 파이썬
    • 2108번 파이썬
    @Eeap
    @Eeap

    티스토리툴바