[Python] 16724 피리 λΆ€λŠ” μ‚¬λ‚˜μ΄

2026. 3. 26. 14:22Β·Coding-Test/λ°±μ€€
728x90
λ°˜μ‘ν˜•

πŸ’» 문제 μ •μ˜

μ„±μš°κ°€ 피리λ₯Ό 뢈 λ•Œλ©΄ 영과일 νšŒμ›λ“€μ€ μžκΈ°λ„ λͺ¨λ₯΄κ²Œ μ„±μš°κ°€ 정해놓은 λ°©ν–₯λŒ€λ‘œ 움직이기 μ‹œμž‘ν•œλ‹€. μ„±μš°κ°€ 정해놓은 λ°©ν–₯은 총 4κ°€μ§€λ‘œ U, D, L, R이고 각각 μœ„, μ•„λž˜, μ™Όμͺ½, 였λ₯Έμͺ½μœΌλ‘œ μ΄λ™ν•˜κ²Œ ν•œλ‹€.

이λ₯Ό μ§€μΌœλ³΄λ˜ μž¬ν›ˆμ΄λŠ” 더 이상 움직이기 νž˜λ“€μ–΄ν•˜λŠ” 영과일 νšŒμ›λ“€μ„ μ§€ν‚€κΈ° μœ„ν•΄ νŠΉμ • 지점에 ‘SAFE ZONE’ μ΄λΌλŠ” μ΅œμ²¨λ‹¨ 방음 μ‹œμ„€μ„ λ§Œλ“€μ–΄ νšŒμ›λ“€μ΄ μ„±μš°μ˜ 피리 μ†Œλ¦¬λ₯Ό λ“£μ§€ λͺ»ν•˜κ²Œ ν•˜λ €κ³  ν•œλ‹€. ν•˜μ§€λ§Œ μ˜ˆμ‚°μ΄ λ„‰λ„‰ν•˜μ§€ μ•Šμ€ μž¬ν›ˆμ΄λŠ” μ„±μš°κ°€ μ„€μ •ν•΄ 놓은 λ°©ν–₯을 λΆ„μ„ν•΄μ„œ μ΅œμ†Œ 개수의 ‘SAFE ZONE’을 λ§Œλ“€λ € ν•œλ‹€.

μ„±μš°κ°€ μ„€μ •ν•œ λ°©ν–₯ 지도가 μ£Όμ–΄μ‘Œμ„ λ•Œ μž¬ν›ˆμ΄λ₯Ό λ„μ™€μ„œ 영과일 νšŒμ›λ“€μ΄ 지도 μ–΄λŠ ꡬ역에 μžˆλ”λΌλ„ μ„±μš°κ°€ 피리λ₯Ό 뢈 λ•Œ ‘SAFE ZONE’에 λ“€μ–΄κ°ˆ 수 있게 ν•˜λŠ” ‘SAFE ZONE’의 μ΅œμ†Œ 개수λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•œλ‹€.

πŸ’‘ μ ‘κ·Ό λ° μ„€κ³„

이동 λ°©ν–₯이 μ •ν•΄μ§„ κ·Έλž˜ν”„μ—μ„œ 탐색을 μ΄μ–΄λ‚˜κ°€λ©° 사이클이 λ°œμƒν•˜λŠ”μ§€ ν™•μΈν•œλ‹€.

✏️ μ•Œκ³ λ¦¬μ¦˜ ν’€μ΄

# 이동 μ •μ˜ ν•¨μˆ˜
def move(x, y, dir):
    if dir == "U":
        return (x-1, y)
    elif dir == "D":
        return (x+1, y)
    elif dir == "L":
        return (x, y-1)
    elif dir == "R":
        return (x, y+1)

def dfs(x, y, group):
    visited[x][y] = group
    
    nx, ny = move(x, y, graph[x][y])

    # 이동 ν›„ 아직 μ–΄λŠ 그룹도 μ•„λ‹ˆλ‹€(= λ°©λ¬Έν•˜μ§€ μ•Šμ•˜λ‹€.)
    if visited[nx][ny] == -1:
        return dfs(nx, ny, group)

    # 이동 ν›„μ˜ κ·Έλ£Ήκ³Ό ν˜„μž¬μ˜ 그룹이 κ°™λ‹€. (= 사이클 λ°œμƒ)
    if visited[nx][ny] == group:
        return 1

    # 사이클 λ°œμƒ X
    return 0

κ·Έλ£Ή λ„˜λ²„λ₯Ό 톡해 사이클을 νŒλ³„ν•œλ‹€. λ°©λ¬Έν•˜μ§€ μ•Šμ€ 점듀을 톡해 탐색을 μ΄μ–΄λ‚˜κ°€λ©΄μ„œ 처음 탐색을 μ‹œμž‘ν•œ 점을 λ§Œλ‚¬μ„ λ•Œ(즉, κ·Έλ£Ή λ„˜λ²„κ°€ 같은 점을 λ§Œλ‚¬μ„ λ•Œ) 사이클이 λ°œμƒν•¨μ„ μ•Œ 수 μžˆλ‹€. λ”°λΌμ„œ Safe Zone을 μ„€μΉ˜ν•  수 μžˆλ‹€.

πŸ—’οΈ μ΅œμ’… 제좜 μ½”λ“œ (Python3 제좜)

# 16724 피리 λΆ€λŠ” μ‚¬λ‚˜μ΄

# 이동 μ •μ˜ ν•¨μˆ˜
def move(x, y, dir):
    if dir == "U":
        return (x-1, y)
    elif dir == "D":
        return (x+1, y)
    elif dir == "L":
        return (x, y-1)
    elif dir == "R":
        return (x, y+1)

def dfs(x, y, group):
    visited[x][y] = group
    
    nx, ny = move(x, y, graph[x][y])

    # 이동 ν›„ 아직 μ–΄λŠ 그룹도 μ•„λ‹ˆλ‹€(= λ°©λ¬Έν•˜μ§€ μ•Šμ•˜λ‹€.)
    if visited[nx][ny] == -1:
        return dfs(nx, ny, group)

    # 이동 ν›„μ˜ κ·Έλ£Ήκ³Ό ν˜„μž¬μ˜ 그룹이 κ°™λ‹€. (= 사이클 λ°œμƒ)
    if visited[nx][ny] == group:
        return 1

    # 사이클 λ°œμƒ X
    return 0

N, M = map(int, input().split())
graph = [list(input()) for _ in range(N)]

visited = [[-1] * M for _ in range(N)] # 방문정보(κ·Έλ£Ή λ„˜λ²„) μ €μž₯

ans = 0 # μ •λ‹΅
group = 0 # κ·Έλ£Ή λ„˜λ²„ 0, 1, 2, ... 
for x in range(N):
    for y in range(M):  
        if visited[x][y] == -1:
            ans += dfs(x, y, group) # 탐색을 톡해 같은 κ·Έλ£Ή νŒλ³„, ν•΄λ‹Ή 그룹에 safe zone 1개 두기
            group += 1 # λ‹€μŒ κ·Έλ£Ή

print(ans)

πŸ’­ 였늘의 νšŒκ³ 

-

728x90
λ°˜μ‘ν˜•
μ €μž‘μžν‘œμ‹œ (μƒˆμ°½μ—΄λ¦Ό)

'Coding-Test > λ°±μ€€' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Python] 1766 λ¬Έμ œμ§‘  (0) 2026.03.26
[Python] 2342 Dance Dance Revolution  (0) 2026.03.20
[Python] 11049 ν–‰λ ¬ κ³±μ…ˆ μˆœμ„œ  (0) 2026.03.20
[Python] 16947 μ„œμšΈ μ§€ν•˜μ²  2ν˜Έμ„   (0) 2026.03.19
[Python] 2613 숫자ꡬ슬  (0) 2026.03.18
'Coding-Test/λ°±μ€€' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [Python] 1766 λ¬Έμ œμ§‘
  • [Python] 2342 Dance Dance Revolution
  • [Python] 11049 ν–‰λ ¬ κ³±μ…ˆ μˆœμ„œ
  • [Python] 16947 μ„œμšΈ μ§€ν•˜μ²  2ν˜Έμ„ 
희완
희완
ν¬μ™„ν•œ 코딩일상
    λ°˜μ‘ν˜•
  • 희완
    Code-Heewan
    희완
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기
      • Python
        • κ°€μƒν™˜κ²½
      • Algorithm
      • Coding-Test
        • λ°±μ€€
        • ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€
        • ν•­ν•΄99
      • Data-Analysis
      • μ›Ή 개발
        • django
      • AWS
      • 곡λͺ¨μ „
      • Mobile
  • 링크

    • Github
  • 300x250
  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.3
희완
[Python] 16724 피리 λΆ€λŠ” μ‚¬λ‚˜μ΄
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”