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
- 스프링 배치 공식문서
- spring reactive programming
- JSONObject 분할
- batchInsert
- 스프링 웹플럭스
- git stage
- jar 소스보기
- JSON 분할
- multi update
- 스프링 배치 메타 테이블
- 무시하기
- 마이바티스 트랜잭션
- org.json
- spring webflux
- 스테이지에 올리기
- Meta Table
- 문자형을 날짜형으로
- str_to_date
- 마리아디비
- ChainedTransactionManager #분산데이터베이스 #Spring Boot #MyBatis
- nonblocking
- JSON 분해
- 폐기하기
- JobExecutionAlreadyRunningException
- date_format
- JSON 분리
- 날짜형을 문자형으로
- 성능개선
- JSONArray 분할
- 스프링 리액티브 프로그래밍
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 |
Comments