-
[이코테 # DFS/BFS 2] 음료수 얼려 먹기(DFS), 미로탈출(BFS)Programming 기초/Coding Test 2023. 6. 7. 23:44
* 음료수 얼려 먹기(p.149)
- DFS
- 시간제한 : 30분
n, m = map(int, input().split()) case = [] for i in range(n): case.append(list(map(int, input()))) def dfs(x, y): # 상하좌우, 현재 위치의 x,y를 입력 if x <= -1 or x >= n or y <= -1 or y >= m: return False if case[x][y] == 0: case[x][y] = 1 dfs(x - 1, y) # 상 dfs(x + 1, y) # 하 dfs(x, y - 1) # 좌 dfs(x, y + 1) # 우 return True return False # 순서대로 탐색해서 아이스크림의 개수를 센다. count = 0 for i in range(n): for j in range(m): if dfs(i, j) == True: count += 1 print(count)
- 못 풂.
- 순환 구조를 짜는 게 어려움.
- 구현 전체 구조 분석.
< dfs함수를 사용하면 count+=1 >
<dfs 함수 >
< dfs 사용 성공 =True>
방문 체크.
이동한 위치에서 dfs함수 호출
< dfs 사용 실패=False>*2회차 bfs 풀이
from collections import deque n,m=map(int,input().split()) #n=row, m=column graph=[] visited=[] for _ in range(n): graph.append(list(map(int,input()))) visited.append([False]*m) def bfs(x,y): queue=deque() queue.append([x,y]) dx=[0,0,-1,1] #상하좌우 dy=[-1,1,0,0] visited[y][x]=True while queue: x,y=queue.popleft() for nx,ny in zip(dx,dy): nx=x+nx ny=y+ny if nx<=-1 or nx>=m or ny<=-1 or ny>=n: continue if graph[ny][nx]==0 and not visited[ny][nx]: queue.append((nx,ny)) visited[ny][nx]=True return 1 count=0 #play for x in range(m): for y in range(n): if graph[y][x]==0 and not visited[y][x]: count+=bfs(x,y) print(count)
#3회차 23.08.18 n,m=map(int,input().split()) # n=row, m=column arr=[] for i in range(n): arr.append(list(map(int,input()))) def dfs(x,y): arr[x][y]=1 dx=[-1,1,0,0] # 상,하,좌,우 dy=[0,0,-1,1] for i in range(4): nx=x+dx[i] ny=y+dy[i] if nx<0 or nx>=n or ny<0 or ny>=m: continue if arr[nx][ny]==0: arr[nx][ny]=1 dfs(nx,ny) count=0 for x in range(n): for y in range(m): if arr[x][y]!=1: dfs(x,y) count+=1 print(count)
* 미로 탈출(p.152)
- BFS
- 시간제한 : 30분
from collections import deque n, m = map(int, input().split()) maze = [] for i in range(n): maze.append(list(map(int, input()))) # 상하좌우 dx = [-1, 1, 0, 0] dy = [0, 0, -1, 1] # bfs 함수 def bfs(x, y): queue = deque() queue.append((x, y)) while queue: # 큐의 사이즈가 0이면 false를 반환한다. x, y = queue.popleft() for i in range(4): # 이동 및 큐 삽입 nx = x + dx[i] ny = y + dy[i] if nx < 0 or nx >= n or ny < 0 or ny >= m: continue if maze[nx][ny] == 0: # 벽인 경우 무시하기 위한 코드인데, 없어도 됨. continue if maze[nx][ny] == 1: maze[nx][ny] = maze[x][y] + 1 queue.append((nx, ny)) return maze[n - 1][m - 1] print(bfs(0, 0))
복기:
1. 아이디어 떠올리기가 어려웠다.
2. queue() 문법 미숙. queue.append((x,y)) 과 x,y = queue.popleft() 기억해둘 것
3. 방향이 나오면 dx, dy로 나누어서 생각하는 것 잊지 말것!
23.08.09 2회차 못 풂...
23.08.11 3회차 15분. 그러나 자잘한 실수들.
23.08.18 4회차 15분.
'Programming 기초 > Coding Test' 카테고리의 다른 글
[이코테 # 정렬2] 기본 정렬 라이브러리를 활용한 문제들 (0) 2023.06.09 [이코테 # 정렬1] 정렬 소스코드, 선택/삽입/퀵/계수 정렬, sorted()와 sort()의 차이 (0) 2023.06.09 [이코테 # DFS/BFS 1] DFS, BFS 예제 (0) 2023.06.07 [이코테 # 구현3] 시뮬레이션 문제 : 게임 개발 (0) 2023.06.07 [이코테 # 구현2] 왕실의 나이트 (0) 2023.06.06