μ•ˆμ „ μ˜μ—­

πŸ“„ 문제

문제

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

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


이제 μœ„μ™€ 같은 지역에 λ§Žμ€ λΉ„κ°€ λ‚΄λ €μ„œ 높이가 4 μ΄ν•˜μΈ λͺ¨λ“  지점이 물에 μž κ²Όλ‹€κ³  ν•˜μž.
이 κ²½μš°μ— 물에 μž κΈ°λŠ” 지점을 νšŒμƒ‰μœΌλ‘œ ν‘œμ‹œν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€. 

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

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

 

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

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

μž…λ ₯

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

좜λ ₯

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

🧞 풀이

더보기

풀이

# [파이썬] λ°±μ€€ 2468번 문제: μ•ˆμ „ μ˜μ—­

from collections import deque                                                                               # deque 뢈러였기

n = int(input())                                                                                            # n μž…λ ₯ 및 ν• λ‹Ή
land = [list(map(int, input().split())) for _ in range(n)]                                                  # land μž…λ ₯ 및 ν• λ‹Ή

dx = [1, -1, 0, 0]                                                                                          # 쒌우 이동
dy = [0, 0, 1, -1]                                                                                          # μƒν•˜ 이동

Q = deque()                                                                                                 # BFSλ₯Ό μœ„ν•œ 빈 큐 ν• λ‹Ή
a_list = []                                                                                                 # μ˜μ—­μ˜ 갯수λ₯Ό λ‹΄κΈ° μœ„ν•œ 빈 a_list ν• λ‹Ή

for k in range(0, 101):                                                                                     # 0λΆ€ν„° 100κΉŒμ§€μ˜ λ¬Όλ†’μ΄κΉŒμ§€ 반볡
    check = [[0] * n for _ in range(n)]                                                                     # μ•ˆ 잠긴 λ•…μ˜ λ°©λ¬Έ μ—¬λΆ€λ₯Ό μœ„ν•œ 빈 λ°°μ—΄ ν• λ‹Ή
    cnt = 0                                                                                                 # λ•…μ˜ 갯수 0으둜 μ΄ˆκΈ°ν™” 및 ν• λ‹Ή
    for i in range(n):
        for j in range(n):
            if land[i][j] > k and check[i][j] != -1:                                                        # 땅이 물높이보닀 λ†’μœΌλ©°, λ°©λ¬Έν•˜μ§€ μ•Šμ€ 경우
                check[i][j] = -1                                                                            # ν•΄λ‹Ή 땅을 λ°©λ¬Έν•œ κ²ƒμœΌλ‘œ λ°”κΏˆ (-1)
                Q.append((i, j))                                                                            # Q에 ν•΄λ‹Ή μ’Œν‘œ κ°’ μΆ”κ°€
                while Q:                                                                                    # Q에 μš”μ†Œκ°€ μžˆμ„ 경우, 계속 반볡
                    x, y = Q.popleft()                                                                      # Q의 μš”μ†Œλ₯Ό λΉΌλ‚΄μ–΄ x, y에 각각 ν• λ‹Ή
                    for l in range(4):                                                                      # 상, ν•˜, 쒌, 우만큼 반볡
                        nx = dx[l] + x
                        ny = dy[l] + y
                        if 0 <= nx < n and 0 <= ny < n and check[nx][ny] != -1 and land[nx][ny] > k:        # nx와 nyκ°€ μ˜μ—­ μ•ˆμ— μžˆμœΌλ©΄μ„œ, λ°©λ¬Έν•˜μ§€ μ•Šμ•˜κ³ , ν•΄λ‹Ή 땅이 물높이보닀 높을 λ•Œ,
                            check[nx][ny] = -1                                                              # ν•΄λ‹Ή 땅을 λ°©λ¬Έν•œ κ²ƒμœΌλ‘œ λ°”κΏ”μ€Œ
                            Q.append((nx, ny))                                                              # Q에 nx, ny μΆ”κ°€
                else:
                    cnt += 1                                                                                # Q에 μš”μ†Œκ°€ μ—†μœΌλ©΄, λ•…μ˜ 갯수 1 μΆ”κ°€
    a_list.append(cnt)                                                                                      # 각 λ¬Όλ†’μ΄λ§ˆλ‹€ λ•…μ˜ μ΅œμ’… 갯수 a_list에 μΆ”κ°€

print(max(a_list))                                                                                          # a_list의 μ΅œλŒ“κ°’ 좜λ ₯

+ Recent posts