🌞Algorithm/πŸ”₯Baekjoon

[Baekjoon] 3184_μ–‘

λΏŒμ•Ό._. 2022. 6. 2. 11:37

Silver II

문제(좜처: https://www.acmicpc.net/problem/3184)

<μ–‘>

문제 

 

λ―Έν‚€μ˜ λ’·λ§ˆλ‹Ήμ—λŠ” νŠΉμ • 수의 양이 μžˆλ‹€. κ·Έκ°€ ν‘Ή μž λ“  사이에 λ°°κ³ ν”ˆ λŠ‘λŒ€λŠ” λ§ˆλ‹Ήμ— 듀어와 양을 κ³΅κ²©ν–ˆλ‹€.
λ§ˆλ‹Ήμ€ ν–‰κ³Ό μ—΄λ‘œ 이루어진 μ§μ‚¬κ°ν˜• λͺ¨μ–‘이닀. κΈ€μž '.' (점)은 빈 ν•„λ“œλ₯Ό μ˜λ―Έν•˜λ©°, κΈ€μž '#'λŠ” μšΈνƒ€λ¦¬λ₯Ό, 'o'λŠ” μ–‘, 'v'λŠ” λŠ‘λŒ€λ₯Ό μ˜λ―Έν•œλ‹€.
ν•œ μΉΈμ—μ„œ μˆ˜ν‰, 수직만으둜 μ΄λ™ν•˜λ©° μšΈνƒ€λ¦¬λ₯Ό μ§€λ‚˜μ§€ μ•Šκ³  λ‹€λ₯Έ 칸으둜 이동할 수 μžˆλ‹€λ©΄, 두 칸은 같은 μ˜μ—­ μ•ˆμ— 속해 μžˆλ‹€κ³  ν•œλ‹€. λ§ˆλ‹Ήμ—μ„œ "νƒˆμΆœ"ν•  수 μžˆλŠ” 칸은 μ–΄λ–€ μ˜μ—­μ—λ„ μ†ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  κ°„μ£Όν•œλ‹€.
λ‹€ν–‰νžˆ 우리의 양은 λŠ‘λŒ€μ—κ²Œ 싸움을 κ±Έ 수 있고 μ˜μ—­ μ•ˆμ˜ μ–‘μ˜ μˆ˜κ°€ λŠ‘λŒ€μ˜ μˆ˜λ³΄λ‹€ λ§Žλ‹€λ©΄ 이기고, λŠ‘λŒ€λ₯Ό μš°λ¦¬μ—μ„œ μ«“μ•„λ‚Έλ‹€. κ·Έλ ‡μ§€ μ•Šλ‹€λ©΄ λŠ‘λŒ€κ°€ κ·Έ μ§€μ—­ μ•ˆμ˜ λͺ¨λ“  양을 λ¨ΉλŠ”λ‹€.
맨 처음 λͺ¨λ“  μ–‘κ³Ό λŠ‘λŒ€λŠ” λ§ˆλ‹Ή μ•ˆ μ˜μ—­μ— μ‘΄μž¬ν•œλ‹€.
아침이 λ„λ‹¬ν–ˆμ„ λ•Œ 살아남은 μ–‘κ³Ό λŠ‘λŒ€μ˜ 수λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ.

 

 

μž…λ ₯

 

첫 μ€„μ—λŠ” 두 μ •μˆ˜ Rκ³Ό Cκ°€ μ£Όμ–΄μ§€λ©°(3 ≤ R, C ≤ 250), 각 μˆ˜λŠ” λ§ˆλ‹Ήμ˜ ν–‰κ³Ό μ—΄μ˜ 수λ₯Ό μ˜λ―Έν•œλ‹€.
λ‹€μŒ R개의 쀄은 C개의 κΈ€μžλ₯Ό κ°€μ§„λ‹€. 이듀은 λ§ˆλ‹Ήμ˜ ꡬ쑰(μšΈνƒ€λ¦¬, μ–‘, λŠ‘λŒ€μ˜ μœ„μΉ˜)λ₯Ό μ˜λ―Έν•œλ‹€.

 

좜λ ₯ 

 

ν•˜λ‚˜μ˜ 쀄에 μ•„μΉ¨κΉŒμ§€ μ‚΄μ•„μžˆλŠ” μ–‘κ³Ό λŠ‘λŒ€μ˜ 수λ₯Ό μ˜λ―Έν•˜λŠ” 두 μ •μˆ˜λ₯Ό 좜λ ₯ν•œλ‹€.

 

 

문제 풀이

- my solution

import sys
from collections import deque

def survival(arr, visited, start, result):
    queue=deque([start])
    sheep=0;wolf=0

    if arr[start[0]][start[1]]=='v': # λŠ‘λŒ€
        wolf+=1
    elif arr[start[0]][start[1]]=='o': # μ–‘
        sheep+=1

    dx=[-1,1,0,0] # μƒν•˜μ’Œμš°
    dy=[0,0,-1,1]

    while queue:
        temp=queue.popleft()
        for i in range(4):
            x=temp[0]+dx[i]
            y=temp[1]+dy[i]
            if 0<=x<len(arr) and 0<=y<len(arr[0]) and visited[x][y]==0:
                if arr[x][y]!="#":
                    queue.append([x,y])
                    visited[x][y]=1
                    if arr[x][y]=='v':
                        wolf+=1
                    elif arr[x][y]=='o':
                        sheep+=1
                else:
                    visited[x][y]=1

    if sheep>wolf:
        result[0]+=sheep
    else:
        result[1]+=wolf


def main():
    r,c=map(int, input().split()) # ν–‰, μ—΄

    arr=[]
    for i in range(r):
        arr.append(list(sys.stdin.readline().strip()))

    visited=[[0]*c for i in range(r)] # λ°©λ¬Έ μ—¬λΆ€
    result=[0,0] # μ–‘, λŠ‘λŒ€ 수
    for i in range(r):
        for j in range(c):
            if arr[i][j]!='#' and visited[i][j]==0: # μšΈνƒ€λ¦¬κ°€ μ•„λ‹ˆκ³  아직 λ°©λ¬Έν•˜μ§€ μ•Šμ•˜λ‹€λ©΄
                visited[i][j]=1 # λ°©λ¬Έ
                survival(arr, visited, [i,j], result)

    print(str(result[0])+" "+ str(result[1]))


if __name__=='__main__':
    main()

 

  • survival ( arr, λ°©λ¬Έ μ—¬λΆ€, μ‹œμž‘ μ’Œν‘œ, κ²°κ³Ό )
    : sheep, wolf  = 같은 μ˜μ—­μ—μ„œ 살아남은 μ–‘κ³Ό λŠ‘λŒ€μ˜ 수
    : queueκ°€ 빌 λ•ŒκΉŒμ§€ 반볡 -> 제일 처음 값을 pop ν•˜μ—¬ μƒν•˜μ’Œμš°λ₯Ό 탐색 -> λ²”μœ„ μ•ˆμ΄λ©° 아직 λ°©λ¬Έν•˜μ§€ μ•Šμ•˜λ‹€λ©΄ -> μšΈνƒ€λ¦¬κ°€ μ•„λ‹ˆλΌλ©΄ queue에 μΆ”κ°€ 및 λ°©λ¬Έ, μ–‘μ΄λ‚˜ λŠ‘λŒ€μΈ 경우 wolf, sheep에 +1 but  μšΈνƒ€λ¦¬λΌλ©΄ 방문만 ν‘œμ‹œ
    : 같은 μ˜μ—­ 탐색을 끝낸 ν›„ 양이 λŠ‘λŒ€λ³΄λ‹€ λ§Žλ‹€λ©΄ result [0]에 μ–‘μ˜ 수 더해주고 λŠ‘λŒ€κ°€ λ§Žκ±°λ‚˜ κ°™λ‹€λ©΄ result [1]에 λŠ‘λŒ€ 수 λ”ν•΄μ€Œ

  • main
    : ν–‰ r, μ—΄ c μž…λ ₯
    : arr μž…λ ₯
    : visited = λ°©λ¬Έ μ—¬λΆ€
    : result = [μ–‘, λŠ‘λŒ€]
    : arr 전체λ₯Ό νƒμƒ‰ν•˜μ—¬ μšΈνƒ€λ¦¬κ°€ μ•„λ‹ˆκ³  아직 λ°©λ¬Έν•˜μ§€ μ•Šμ•˜λ‹€λ©΄ λ°©λ¬Έ ν›„ ν•¨μˆ˜ 호좜
    : result 좜λ ₯

μƒκ°πŸ€”