Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 연구
- 프로그래머스
- 가상환경
- dfs
- 알고리즘
- gpt1
- transformer
- ChatGPT
- LLM
- Aspect
- SQL 첫걸음
- 그래프
- GPT
- 파이썬
- outer join
- paper review
- 자연어처리
- 논문리뷰
- 코딩테스트
- ABAE
- 백준
- NLP
- join
- SQL
- 머신러닝
- Bert
- 분산
- leetcode
- MySQL
- deepseek
Archives
- Today
- Total
huginn muninn
[백준] 1303 전투 파이썬 본문
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 |