[ BOJ / Python 3184번 양

황승환·2022년 2월 3일
0

Python

목록 보기
149/498


이번 문제는 깊이우선탐색을 통해 해결하였다. 일반적인 깊이우선탐색 문제와 비슷하게 풀이하였지만 조금은 달랐다. 그때 그때 좌표의 값에 따라서 영역 안의 늑대와 양의 수를 카운팅하고 깊이우선탐색이 한번 끝날 때마다 늑대와 양의 수를 비교하여 더 큰 수를 해당 카운팅 변수에 더해주는 방식으로 접근하였다.

  • 재귀 제한을 늘려준다.
  • dfs함수를 y, x를 인자로 갖도록 선언한다.
    -> 함수 밖의 변수 v와 o를 갱신하기 위해 global을 이용하여 v, o를 선언해준다.
    -> visited[y][x]를 True로 갱신한다.
    -> 4가지 방향으로의 이동에 대한 정보를 dy, dx 리스트에 짝지어 저장한다.
    -> 4번 반복하는 i에 대한 for문을 돌린다.
    --> ny를 y+dy[i]로 선언한다.
    --> nx를 x+dx[i]로 선언한다.
    --> 만약 ny, nx가 0보다 크거나 같고, ny가 r보다 작고, nx가 c보다 작을 경우,
    ---> 만약 visited[ny][nx]가 False이고 field[ny][nx]가 '#'이 아닐 경우,
    ----> 만약 field[ny][nx]가 'v'일 경우, v를 1 증가시킨다.
    ----> 만약 field[ny][nx]가 'o'일 경우, o를 1 증가시킨다.
    ---> dfs(ny, nx)를 재귀호출한다.
  • r, c를 입력받는다.
  • 마당에 해당하는 리스트 field를 선언한다.
  • r번 반복하는 for문을 돌린다.
    -> field를 입력받는다.
  • 방문처리에 사용할 리스트 visited를 선언하고 False를 r*c만큼 채운다.
  • 늑대의 최종 수를 누적할 변수 v_cnt를 0으로 선언한다.
  • 양의 최종 수를 누적할 변수 o_cnt를 0으로 선언한다.
  • dfs함수에서 사용할 그때 그때의 늑대와 양의 수를 카운팅할 변수 v, o를 0으로 선언한다.
  • r번 반복하는 i에 대한 for문을 돌린다.
    -> c번 반복하는 j에 대한 for문을 돌린다.
    --> 만약 field[i][j]가 '#'가 아니고, visited[i][j]가 False일 경우,
    ---> 만약 field[i][j]가 'v'일 경우, v를 1 증가시킨다.
    ---> 만약 field[i][j]가 'o'일 경우, o를 1 증가시킨다.
    ---> dfs(i, j)를 호출한다.
    ---> 만약 v가 o보다 작을 경우, o_cnt에 o를 더한다.
    ---> 그 외에는 v_cnt에 v를 더한다.
  • o_cnt, v_cnt를 출력한다.

Code

import sys
sys.setrecursionlimit(10**9)
def dfs(y, x):
    global v
    global o
    visited[y][x]=True
    dy=[0, 0, 1, -1]
    dx=[1, -1, 0, 0]
    for i in range(4):
        ny=y+dy[i]
        nx=x+dx[i]
        if ny>=0 and nx>=0 and ny<r and nx<c:
            if visited[ny][nx]==False and field[ny][nx]!='#':
                if field[ny][nx]=='v':
                    v+=1
                if field[ny][nx]=='o':
                    o+=1
                dfs(ny, nx)
r,c=map(int, input().split())
field=[]
for _ in range(r):
    field.append(list(str(input())))
visited=[[False]*c for _ in range(r)]
v_cnt=0
o_cnt=0
v=0
o=0
for i in range(r):
    for j in range(c):
        if field[i][j]!='#' and visited[i][j]==False:
            if field[i][j]=='v':
                v+=1
            if field[i][j]=='o':
                o+=1
            dfs(i, j)
            if v<o:
                o_cnt+=o
            else:
                v_cnt+=v
            o, v=0,0
print(o_cnt, v_cnt)

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글