1. 경쟁적 전염
- 난이도
- 중
- 풀이 시간
- 50분
- 시간 제한
- 1초
- 메모리 제한
- 256 MB
- 출처
A. 문제
- 중
- 50분
- 1초
- 256 MB
위 백준 사이트에 접속하여 문제를 확인해주세요.
B. 내 답안
a. 1차 시도 (실패)
def dfs(graph, s, x, y):
global n
ds = ((-1, 0), (1, 0), (0, -1), (0, 1))
# for i in range(s):
if s < 0:
return
else:
s -= 1
for d in ds:
dx = x + d[0]
dy = y + d[1]
if dx < 0 or dx >= n or dy < 0 or dy >= n:
continue
if graph[dx][dy] == 0 and temp_graph[dx][dy] == 0:
graph[dx][dy] = graph[x][y]
elif graph[dx][dy] != 0 and temp_graph[dx][dy] == 0:
graph[dx][dy] = min(graph[x][y], graph[dx][dy])
continue
elif graph[dx][dy] != 0 and temp_graph[dx][dy] != 0:
continue
# graph[dx][dy] = max(graph[dx][dy], temp_graph[x][y])
dfs(graph, s, dx, dy)
global n
n, k = list(map(int, input().split()))
graph = []
# 0, 0부터 리스트에 담는거 까먹음
for i in range(n):
temp = list(map(int, input().split()))
graph.append(temp)
s, x, y = list(map(int, input().split()))
x -= 1
y -= 1
temp_graph = [i[:] for i in graph]
# for i in range(n):
# for j in range(n):
# dfs(graph, s, i, j)
#
for i in range(s):
for i in range(n):
for j in range(n):
if temp_graph[i][j] != 0:
dfs(graph, s, i, j)
if graph[x][y] == 0:
print(0)
else:
print(graph[x][y])
print(*graph, sep='\n')
b. 2차 시도 (성공)
from collections import deque
n, k = list(map(int, input().split()))
graph = [[0] * (n+1) for i in range(n+1)]
data = []
for i in range(1, n+1):
temp = list(map(int, input().split()))
for j in range(1, n+1):
graph[i][j] = temp[j-1]
if graph[i][j] != 0:
data.append([graph[i][j], 0, i, j])
# for i in range(1, n+1):
# temp = [0]
# temp.append(list(map(int, input().split())))
# # graph.append(temp)
# for t in range(len(temp)):
# if temp[t] != 0:
# data.append([temp[t], 0, i, t])
s, x, y = list(map(int, input().split()))
data.sort()
q = deque(data)
ds = ((-1, 0), (1, 0), (0, -1), (0, 1))
while q:
q_value, q_s, q_x, q_y = q.popleft()
if q_s == s:
break
for d in ds:
dx = q_x + d[0]
dy = q_y + d[1]
if dx < 1 or dx > n or dy < 1 or dy > n:
continue
if graph[dx][dy] != 0:
continue
graph[dx][dy] = q_value
q.append([q_value, q_s+1, dx, dy])
print(graph[x][y])
c. 회고
내 풀이
- dfs라고 생각했다. 그래서 그냥 DFS로 풀려고 했다.
반성
- 바이러스의 값이 작은 것부터 전파된다는 점이 DFS로는 풀 수 없는 한계였다.
결론
- 문제를 잘 파악해서, DFS가 효율적일지 BFS가 효율적일지 생각하자.
C. 문제 해설
이해한 내용을 바탕으로 작성했습니다.
def dfs(graph, s, x, y):
global n
ds = ((-1, 0), (1, 0), (0, -1), (0, 1))
# for i in range(s):
if s < 0:
return
else:
s -= 1
for d in ds:
dx = x + d[0]
dy = y + d[1]
if dx < 0 or dx >= n or dy < 0 or dy >= n:
continue
if graph[dx][dy] == 0 and temp_graph[dx][dy] == 0:
graph[dx][dy] = graph[x][y]
elif graph[dx][dy] != 0 and temp_graph[dx][dy] == 0:
graph[dx][dy] = min(graph[x][y], graph[dx][dy])
continue
elif graph[dx][dy] != 0 and temp_graph[dx][dy] != 0:
continue
# graph[dx][dy] = max(graph[dx][dy], temp_graph[x][y])
dfs(graph, s, dx, dy)
global n
n, k = list(map(int, input().split()))
graph = []
# 0, 0부터 리스트에 담는거 까먹음
for i in range(n):
temp = list(map(int, input().split()))
graph.append(temp)
s, x, y = list(map(int, input().split()))
x -= 1
y -= 1
temp_graph = [i[:] for i in graph]
# for i in range(n):
# for j in range(n):
# dfs(graph, s, i, j)
#
for i in range(s):
for i in range(n):
for j in range(n):
if temp_graph[i][j] != 0:
dfs(graph, s, i, j)
if graph[x][y] == 0:
print(0)
else:
print(graph[x][y])
print(*graph, sep='\n')
b. 2차 시도 (성공)
from collections import deque
n, k = list(map(int, input().split()))
graph = [[0] * (n+1) for i in range(n+1)]
data = []
for i in range(1, n+1):
temp = list(map(int, input().split()))
for j in range(1, n+1):
graph[i][j] = temp[j-1]
if graph[i][j] != 0:
data.append([graph[i][j], 0, i, j])
# for i in range(1, n+1):
# temp = [0]
# temp.append(list(map(int, input().split())))
# # graph.append(temp)
# for t in range(len(temp)):
# if temp[t] != 0:
# data.append([temp[t], 0, i, t])
s, x, y = list(map(int, input().split()))
data.sort()
q = deque(data)
ds = ((-1, 0), (1, 0), (0, -1), (0, 1))
while q:
q_value, q_s, q_x, q_y = q.popleft()
if q_s == s:
break
for d in ds:
dx = q_x + d[0]
dy = q_y + d[1]
if dx < 1 or dx > n or dy < 1 or dy > n:
continue
if graph[dx][dy] != 0:
continue
graph[dx][dy] = q_value
q.append([q_value, q_s+1, dx, dy])
print(graph[x][y])
c. 회고
내 풀이
- dfs라고 생각했다. 그래서 그냥 DFS로 풀려고 했다.
반성
- 바이러스의 값이 작은 것부터 전파된다는 점이 DFS로는 풀 수 없는 한계였다.
결론
- 문제를 잘 파악해서, DFS가 효율적일지 BFS가 효율적일지 생각하자.
C. 문제 해설
이해한 내용을 바탕으로 작성했습니다.
from collections import deque
n, k = list(map(int, input().split()))
graph = [[0] * (n+1) for i in range(n+1)]
data = []
for i in range(1, n+1):
temp = list(map(int, input().split()))
for j in range(1, n+1):
graph[i][j] = temp[j-1]
if graph[i][j] != 0:
data.append([graph[i][j], 0, i, j])
# for i in range(1, n+1):
# temp = [0]
# temp.append(list(map(int, input().split())))
# # graph.append(temp)
# for t in range(len(temp)):
# if temp[t] != 0:
# data.append([temp[t], 0, i, t])
s, x, y = list(map(int, input().split()))
data.sort()
q = deque(data)
ds = ((-1, 0), (1, 0), (0, -1), (0, 1))
while q:
q_value, q_s, q_x, q_y = q.popleft()
if q_s == s:
break
for d in ds:
dx = q_x + d[0]
dy = q_y + d[1]
if dx < 1 or dx > n or dy < 1 or dy > n:
continue
if graph[dx][dy] != 0:
continue
graph[dx][dy] = q_value
q.append([q_value, q_s+1, dx, dy])
print(graph[x][y])
내 풀이
- dfs라고 생각했다. 그래서 그냥 DFS로 풀려고 했다.
반성
- 바이러스의 값이 작은 것부터 전파된다는 점이 DFS로는 풀 수 없는 한계였다.
결론
- 문제를 잘 파악해서, DFS가 효율적일지 BFS가 효율적일지 생각하자.
C. 문제 해설
이해한 내용을 바탕으로 작성했습니다.
이해한 내용을 바탕으로 작성했습니다.
시간이 흐를때마다 바이러스는 값이 작은 것부터 확산된다. 바이러스가 위치한 곳에 다른 바이러스는 확산되지 못한다. (비선점 스케줄링)
a. 책 답안
python-for-coding-test/3.py at master · ndb796/python-for-coding-test (github.com)
참고문헌
[1] 나동빈, "이것이 취업을 위한 코딩 테스트다 with 파이썬", 초판, 2쇄, 한빛미디어, 2020년
[2] baekjoon. 1065번: 한수 (acmicpc.net). Baekjoon. (accessed Sep 5, 2021)
Ghost