huginn muninn

[백준] 1303 전투 파이썬 본문

코딩테스트

[백준] 1303 전투 파이썬

_maddy 2024. 3. 19. 23:59

 

 

1303번: 전쟁 - 전투

첫째 줄에는 전쟁터의 가로 크기 N, 세로 크기 M(1 ≤ N, M ≤ 100)이 주어진다. 그 다음 두 번째 줄에서 M+1번째 줄에는 각각 (X, Y)에 있는 병사들의 옷색이 띄어쓰기 없이 주어진다. 모든 자리에는

www.acmicpc.net

실버1 이었고 처음에 dfs풀어서 런타임 에러가 발생했다. 그래서 bfs로 다시 풀었음.

 

DFS로 풀 때 런타임 에러가 발생하는 이유 : 

1. 스택 오버플로우

  •  DFS는 재귀함수 또는 스택을 사용해 구현할 수 있다. 하지만 입력의 크기가 커지면서 재귀 호출이 너무 깊어져 스택 오버플로우가 발생할 수 있다. 
  • 특히 이 문제에서는 가로 크기와 세로 크기가 최대 100이므로 재귀 호출이 깊어지는 경우가 발생할 수 있다. 

BFS로 풀어야 하는 이유 : 

1. 시간 복잡도가 더 효율적이다. 

  • BFS의 시간 복잡도는 O(V+E). V는 정점. E는 간선, DFS는 시간 복잡도가 O(V+E) 이상일 수 있다. 

 

<정답코드_BFS>

#1303 전투 bfs
from collections import deque

n, m = map(int, input().split())
maps=[]
visited=[[0]*n for i in range(m)]

for i in range(m):
    li=input()
    li=list(li)
    maps.append(li)


def bfs(v,x,y,visited,maps,n,m):
    queue=deque()
    queue.append([x,y])
    count=1
    visited[y][x]=1

    dx=[-1,1,0,0]
    dy=[0,0,-1,1]

    while queue:
        x,y=queue.popleft()

        for i in range(4):
            nx=x+dx[i]
            ny=y+dy[i]

            if 0<=nx<n and 0<=ny<m:
                if visited[ny][nx]==0 and maps[ny][nx]==v:
                    visited[ny][nx]=1
                    queue.append([nx,ny])
                    count+=1

    return count

wlist=[]
blist=[]

for i in range(m):
    for j in range(n):
        if visited[i][j]==0 and maps[i][j]=='W':
            count=bfs('W',j,i,visited,maps,n,m)
            wlist.append(count)
        if visited[i][j]==0 and maps[i][j]=='B':
            count=bfs('B',j,i,visited,maps,n,m)
            blist.append(count)
            

#위력
wlist=list(map(lambda x:x**2,wlist))
blist=list(map(lambda x:x**2,blist))

print(sum(wlist),sum(blist))

 

 

< DFS 풀이>

 

런타임에러난 코드. 근데 일단 맞긴 함. 

#1303 전투_dfs 런타임에러
n, m = map(int, input().split())
maps=[]
visited=[[0]*n for i in range(m)]

for i in range(m):
    li=input()
    li=list(li)
    maps.append(li)

def dfs(v,maps,visited,n,m,x,y):
    global count

    dx=[-1,1,0,0]
    dy=[0,0,-1,1]

    visited[y][x]=1

    for i in range(4):
        nx=x+dx[i]
        ny=y+dy[i]

        if 0<=nx<n and 0<=ny<m:
            if visited[ny][nx]==0 and maps[ny][nx]==v:
                visited[ny][nx]=1
                count+=1
                dfs(v,maps,visited,n,m,nx,ny)
wlist=[]
blist=[]

for i in range(m):
    for j in range(n):
        if maps[i][j]=='W' and visited[i][j]==0:
            count=1
            dfs('W',maps,visited,n,m,j,i)
            wlist.append(count)
        elif maps[i][j]=='B' and visited[i][j]==0:
            count=1
            dfs('B',maps,visited,n,m,j,i)
            blist.append(count)

#적국의 병사 위력의 합 출력
wlist=list(map(lambda x:x**2,wlist))
blist=list(map(lambda x:x**2,blist))

print(sum(wlist),sum(blist))

 

 

 

'코딩테스트' 카테고리의 다른 글

[백준] 2493 탑  (0) 2024.03.29
[백준] 퇴사2 파이썬 DP  (0) 2024.03.22
[프로그래머스] 네트워크 파이썬  (0) 2024.03.18
[프로그래머스] 타겟 넘버 파이썬  (0) 2024.03.18
[프로그래머스] 옹알이1 파이썬  (1) 2023.10.09