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 |
Tags
- 아이템 리더 페이징 처리
- 스프링배치 메타테이블
- 스프링 배치 5
- flatfileitemwriter
- 스프링배치 csv
- JSONObject 분할
- 스프링배치 엑셀
- 읽기 작업과 쓰기 작업 분리
- step 여러개
- Spring Batch
- 아이템 리더 커스텀
- JSON 분리
- 마이바티스 트랜잭션
- JSON 분할
- spring batch 5
- 스프링 트랜잭션 관리
- api 아이템 리더
- JSONArray 분할
- step 사이 변수 공유
- step 값 공유
- abstractpagingitemreader
- aop proxy
- 트랜잭션 분리
- executioncontext 변수 공유
- executioncontext
- stepexecutionlistener
- 선언적 트랜잭션 관리
- spring batch 변수 공유
- mybatis
- job parameter
Archives
- Today
- Total
ebson
boj.kr/2638 치즈 (gold3) 파이썬 풀이 본문
dfs 방식으로 풀이 시도한 결과 테스트 케이스는 통과했지만 제출시 시간 초과 또는 메모리 초과가 발생했다.
dfs 풀이(시간초과)
N, M = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(N)]
visited = [[False]*M for _ in range(N)]
dy = (1, -1, 0, 0)
dx = (0, 0, 1, -1)
from collections import deque
def bfs(y, x):
dq = deque()
dq.append((y, x))
while dq:
(y, x) = dq.popleft()
graph[y][x] = -2
for i in range(4):
ny = y + dy[i]
nx = x + dx[i]
if 0 <= ny < N and 0 <= nx < M and graph[ny][nx] == 0 and not visited[ny][nx]:
visited[ny][nx] = True
dq.append((ny, nx))
visited[0][0] = True
bfs(0, 0)
def get_cheese_set():
global cheese_set
for y in range(N):
for x in range(M):
if graph[y][x] == 1:
cheese_set.add((y, x))
return cheese_set
def one_hour_later():
for (y, x) in list(cheese_set):
cnt = 0
for i in range(4):
ny = y + dy[i]
nx = x + dx[i]
if 0 <= ny < N and 0 <= nx < M and graph[ny][nx] == -2:
cnt+=1
if cnt >= 2:
graph[y][x] = -2
cheese_set.remove((y, x))
hour_cnt = 1
cheese_set = set()
cheese_set = get_cheese_set()
while len(cheese_set) > 0:
one_hour_later()
hour_cnt += 1
print(hour_cnt)
정답 풀이
1. 남은 치즈가 없을 떄까지 아래를 반복
1.1. 치즈여부 graph에 대해 bfs를 아래와 같이 실행한다.
1.1.1. 체크 배열 chk를 graph 크기만큼 0으로 초기화
1.1.2. deque에 (0, 0)을 추가
1.1.3. chk[0][0]을 1으로 갱신
1.1.4 dq가 빌 때까지 아래를 반복
1.1.4.1. (cy, cx) 으로 dq.popleft()한 값을 저장
1.1.4.2. (cy, cx)의 상하좌우 좌표에 대하여 각각 아래를 검사하고 수행
1.1.4.2.1. 그래프상의 좌표이고 그래프의 해당좌표값이 0이면서 체크배열의 해당좌표값이 0이거나, 그래프의 해당좌표값이 1이면서 체크배열의 해당좌표값이 2보다 크지 않으면, 체크배열의 해당좌표값을 1 증감, 그래프의 해당좌표값이 0이면 deque에 해당 좌표를 추가, 그래프의 해당좌표값이 1이면서 체크배열의 해당좌표값이 2이면 그래프의 해당좌표값을 0으로 갱신
1.2. bfs를 종료 후 hours 카운트를 1 증감
2. 남은 치즈가 없으므로 hours 카운트를 출력
N, M = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(N)]
dy = [1, -1, 0, 0]
dx = [0, 0, 1, -1]
from collections import deque
def bfs():
chk = [[0 for _ in range(M)] for _ in range(N)]
dq = deque()
dq.append((0, 0))
chk[0][0] = 1
while dq:
(cy, cx) = dq.popleft()
for i in range(4):
ny = cy + dy[i]
nx = cx + dx[i]
if 0<=ny<N and 0<=nx<M and ((graph[ny][nx] == 0 and chk[ny][nx] == 0)
or (graph[ny][nx] == 1 and not chk[ny][nx] > 2)):
chk[ny][nx] += 1
if graph[ny][nx] == 0:
dq.append((ny, nx))
if graph[ny][nx] == 1 and chk[ny][nx] == 2:
graph[ny][nx] = 0
def is_no_cheese_left():
tot = 0
for _ in graph:
tot += sum(_)
return tot == 0
hours = 0
while True:
if is_no_cheese_left():
break
bfs()
hours += 1
print(hours)
bfs 방식으로 풀이해야 모든 테스트 케이스에 대해 시간 초과 또는 메모리 초과가 발생하지 않는다.
'ALGORITHM STUDY WITH PYTHON > BFS | DFS' 카테고리의 다른 글
boj.kr/2178 미로 탐색 (silver1) 자바 풀이 (0) | 2024.06.01 |
---|---|
boj.kr/17471 게리멘더링 (gold4) 파이썬 풀이 (1) | 2023.05.06 |
boj.kr/1325 효율적인 해킹 (silver1) 파이썬 풀이 (0) | 2023.05.04 |
boj.kr/1926 그림 (silver1) 파이썬 풀이 (0) | 2023.05.04 |
boj.kr/9466 팀 프로젝트 (gold3) 파이썬 풀이 (0) | 2023.05.03 |