ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] λ°±μ€€ - 2468 μ•ˆμ „ μ˜μ—­
    __Python/__Algorithm 2022. 2. 22. 14:00

      λ¬Έμ œ

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

     

    πŸ”Ή λ¬Έμ œ

    μž¬λ‚œλ°©μž¬μ²­μ—μ„œλŠ” λ§Žμ€ λΉ„κ°€ λ‚΄λ¦¬λŠ” μž₯λ§ˆμ² μ— λŒ€λΉ„ν•΄μ„œ λ‹€μŒκ³Ό 같은 일을 κ³„νšν•˜κ³  μžˆλ‹€. λ¨Όμ € μ–΄λ–€ μ§€μ—­μ˜ 높이 정보λ₯Ό νŒŒμ•…ν•œλ‹€. κ·Έ λ‹€μŒμ— κ·Έ 지역에 λ§Žμ€ λΉ„κ°€ 내렸을 λ•Œ 물에 μž κΈ°μ§€ μ•ŠλŠ” μ•ˆμ „ν•œ μ˜μ—­μ΄ μ΅œλŒ€λ‘œ λͺ‡ κ°œκ°€ λ§Œλ“€μ–΄ μ§€λŠ” 지λ₯Ό μ‘°μ‚¬ν•˜λ €κ³  ν•œλ‹€. μ΄λ•Œ, 문제λ₯Ό κ°„λ‹¨ν•˜κ²Œ ν•˜κΈ° μœ„ν•˜μ—¬, μž₯λ§ˆμ² μ— λ‚΄λ¦¬λŠ” λΉ„μ˜ 양에 따라 μΌμ •ν•œ 높이 μ΄ν•˜μ˜ λͺ¨λ“  지점은 물에 μž κΈ΄λ‹€κ³  κ°€μ •ν•œλ‹€.

    μ–΄λ–€ μ§€μ—­μ˜ 높이 μ •λ³΄λŠ” ν–‰κ³Ό μ—΄μ˜ 크기가 각각 N인 2차원 λ°°μ—΄ ν˜•νƒœλ‘œ 주어지며 λ°°μ—΄μ˜ 각 μ›μ†ŒλŠ” ν•΄λ‹Ή μ§€μ μ˜ 높이λ₯Ό ν‘œμ‹œν•˜λŠ” μžμ—°μˆ˜μ΄λ‹€. 예λ₯Ό λ“€μ–΄, λ‹€μŒμ€ N=5인 μ§€μ—­μ˜ 높이 정보이닀.

     

    물에 μž κΈ°μ§€ μ•ŠλŠ” μ•ˆμ „ν•œ μ˜μ—­μ΄λΌ 함은 물에 μž κΈ°μ§€ μ•ŠλŠ” 지점듀이 μœ„, μ•„λž˜, 였λ₯Έμͺ½ ν˜Ήμ€ μ™Όμͺ½μœΌλ‘œ 인접해 있으며 κ·Έ 크기가 μ΅œλŒ€μΈ μ˜μ—­μ„ λ§ν•œλ‹€. μœ„μ˜ κ²½μš°μ—μ„œ 물에 μž κΈ°μ§€ μ•ŠλŠ” μ•ˆμ „ν•œ μ˜μ—­μ€ 5κ°œκ°€ λœλ‹€(κΌ­μ§“μ μœΌλ‘œλ§Œ λΆ™μ–΄ μžˆλŠ” 두 지점은 μΈμ ‘ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  μ·¨κΈ‰ν•œλ‹€).

    λ˜ν•œ μœ„μ™€ 같은 μ§€μ—­μ—μ„œ 높이가 6μ΄ν•˜μΈ 지점을 λͺ¨λ‘ 잠기게 λ§Œλ“œλŠ” λ§Žμ€ λΉ„κ°€ 내리면 물에 μž κΈ°μ§€ μ•ŠλŠ” μ•ˆμ „ν•œ μ˜μ—­μ€ μ•„λž˜ κ·Έλ¦Όμ—μ„œμ™€ 같이 λ„€ κ°œκ°€ 됨을 확인할 수 μžˆλ‹€. 

    이와 같이 μž₯λ§ˆμ² μ— λ‚΄λ¦¬λŠ” λΉ„μ˜ 양에 λ”°λΌμ„œ 물에 μž κΈ°μ§€ μ•ŠλŠ” μ•ˆμ „ν•œ μ˜μ—­μ˜ κ°œμˆ˜λŠ” λ‹€λ₯΄κ²Œ λœλ‹€. μœ„μ˜ μ˜ˆμ™€ 같은 μ§€μ—­μ—μ„œ λ‚΄λ¦¬λŠ” λΉ„μ˜ 양에 λ”°λ₯Έ λͺ¨λ“  경우λ₯Ό λ‹€ 쑰사해 보면 물에 μž κΈ°μ§€ μ•ŠλŠ” μ•ˆμ „ν•œ μ˜μ—­μ˜ 개수 μ€‘μ—μ„œ μ΅œλŒ€μΈ κ²½μš°λŠ” 5μž„μ„ μ•Œ 수 μžˆλ‹€.

    μ–΄λ–€ μ§€μ—­μ˜ 높이 정보가 μ£Όμ–΄μ‘Œμ„ λ•Œ, μž₯λ§ˆμ² μ— 물에 μž κΈ°μ§€ μ•ŠλŠ” μ•ˆμ „ν•œ μ˜μ—­μ˜ μ΅œλŒ€ 개수λ₯Ό κ³„μ‚°ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. 

     

    πŸ”Ή μž…λ ₯

    첫째 μ€„μ—λŠ” μ–΄λ–€ 지역을 λ‚˜νƒ€λ‚΄λŠ” 2차원 λ°°μ—΄μ˜ ν–‰κ³Ό μ—΄μ˜ 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 수 N이 μž…λ ₯λœλ‹€. N은 2 이상 100 μ΄ν•˜μ˜ μ •μˆ˜μ΄λ‹€. λ‘˜μ§Έ 쀄뢀터 N개의 각 μ€„μ—λŠ” 2차원 λ°°μ—΄μ˜ 첫 번째 ν–‰λΆ€ν„° N번째 ν–‰κΉŒμ§€ μˆœμ„œλŒ€λ‘œ ν•œ ν–‰μ”© 높이 정보가 μž…λ ₯λœλ‹€. 각 μ€„μ—λŠ” 각 ν–‰μ˜ 첫 번째 μ—΄λΆ€ν„° N번째 μ—΄κΉŒμ§€ N개의 높이 정보λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μžμ—°μˆ˜κ°€ 빈 칸을 사이에 두고 μž…λ ₯λœλ‹€. λ†’μ΄λŠ” 1이상 100 μ΄ν•˜μ˜ μ •μˆ˜μ΄λ‹€.

    πŸ”Ή μΆœλ ₯

    첫째 쀄에 μž₯λ§ˆμ² μ— 물에 μž κΈ°μ§€ μ•ŠλŠ” μ•ˆμ „ν•œ μ˜μ—­μ˜ μ΅œλŒ€ 개수λ₯Ό 좜λ ₯ν•œλ‹€.

     

      ν’€μ΄ 방법

     

    πŸ”Ή κ·Έλž˜ν”„ 탐색

    πŸ”Ή BFS(λ„ˆλΉ„μš°μ„ νƒμƒ‰)

    πŸ”Ή ν‹€λ ΈμŠ΅λ‹ˆλ‹€ ν•΄κ²° > μž…μΆœλ ₯ 예제 ν•˜λ‹¨μ— μΆ”κ°€ 정보가 μžˆμ—ˆλ‹€. "아무 지역도 물에 μž κΈ°μ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€."

         μ¦‰, λͺ¨λ“  μ˜μ—­μ˜ μ΅œμ†Œ 높이 μ΄ν•˜λ‘œ 물에 μž κ²Όμ„ μˆ˜λ„ μžˆλ‹€. (각 μ˜μ—­ 높이 3~9, 2 μ΄ν•˜λ‘œ 물에 μž κ²Όμ„ λ•Œ)

         λ˜ν•œ, λΉ„κ°€ μ „ν˜€ 내리지 μ•Šμ•˜μ„ μˆ˜λ„ μžˆλ‹€. (물에 잠긴 깊이 0)

    πŸ”Ή DFS 풀이 μ‹œ, λŸ°νƒ€μž„ μ—λŸ¬(RecursionError)λ₯Ό ν•΄κ²°ν•˜μ§€ λͺ»ν–ˆλ‹€.

    πŸ”Ή 이전에 ν’€μ—ˆλ˜ λ‹¨μ§€λ²ˆν˜ΈλΆ™μ΄κΈ° λ¬Έμ œμ™€ μœ μ‚¬ν•˜λ‹€.

     

      κ΅¬ν˜„ μ½”λ“œ

    import sys
    from collections import deque
    
    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]
    def bfs(q,h):
        while q:
            x,y = q.popleft()
            for k in range(4):
                nx = x + dx[k]
                ny = y + dy[k]
                if 0<=nx<n and 0<=ny<n and area[nx][ny]>h and visited[nx][ny]==0:
                    visited[nx][ny] = 1
                    q.append([nx,ny])
    
    n = int(sys.stdin.readline())
    area = [list(map(int,sys.stdin.readline().split())) for _ in range(n)]
    M = max(max(area))
    ans = 0
    
    for h in range(0,M):
        cnt = 0
        visited = [[0]*n for _ in range(n)]
    
        for i in range(n):
            for j in range(n):
                if area[i][j]>h and visited[i][j]==0:
                    bfs(deque([[i,j]]),h)
                    visited[i][j] = 1
                    cnt += 1
        if cnt > ans:
            ans = cnt
    print(ans)

     

      μ‹€ν–‰ κ²°κ³Ό

      πŸ’‘

     

     

     

     

     

     

     

     

    728x90

    λŒ“κΈ€

Designed by Tistory.