본문 바로가기

BFS6

[프로그래머스] 가장 먼 노드 / 파이썬 / python / BFS 💡 solutions 💬 최단 거리 로직을 위해 BFS 알고리즘으로 구현한다. -> deque 자료구조 사용 💬 visit 배열을 가지고 방문했는지 확인함과 동시에 1부터 해당 노드까지의 거리를 저장한다. 👨‍💻 code from collections import deque def solution(n, edge): adj = [[] for _ in range(n+1)] visit = [0] * (n+1) for a, b in edge: adj[a].append(b) adj[b].append(a) visit[1] = 1 q = deque([1]) while q: x = q.popleft() for next in adj[x]: if not visit[next]: visit[next] = visit[x] + .. 2021. 12. 27.
[백준] 케빈 베이컨의 6단계 법칙 / 파이썬 / python / BFS 알고리즘 💡solutions ) 💬 처음 adj라는 인접행렬을 만들어 각 유저 간의 연결 상태를 나타내고 -> 덱 자료구조를 사용해서 BFS 알고리즘으로 구현하면 문제를 쉽게 해결할 수 있다. 💬 첫 시도에서 스택 자료구조를 사용해서 DFS 알고리즘 구조로 풀었더니 채점결과 실패했다. 이유는 해당 문제에선 출발지에서 각 노드까지의 최단 거리를 찾는 개념이기 때문에 DFS로 찾게 되면 최단 거리가 아닐 수 있기 때문이다. BFS와 DFS로 거리 구할 때의 차이 해당 문제에서 테스트케이스가 아래처럼 주어지는 경우 DFS로 거리를 찾는다면 ->1에서 2까지의 거리가 1, 3까지의 거리가 2가 나온다. 이와 비교하여 BFS에서는 1에서 2까지 그리고 1에서 3까지 모두 거리가 1이 나오므로 최단거리가 된다. 3 3 1 .. 2021. 11. 5.
[백준] 맥주 마시면서 걸어가기 / 9205번 / 파이썬 / python / BFS 알고리즘 💡solutions 💬 BFS 알고리즘으로 문제 해결하였다. 💬 주어진 좌표들을 사용하는데 -> 상근이네집(home_x, home_y)에서부터 탐색을 시작한다. 💬 편의점 좌표를 돌아가며 방문 가능 유무를 확인한다 -> 두 가지를 확인하는데 ①이미 방문했는지 ② 20개의 맥주로 이동할 수 있는 거리인지를 확인한다. 💬 q에서 popleft하여 다음으로 이동할 좌표가 락 페스티벌 좌표(rock_x, rock_y)이면 행복하게 페스티벌에 갈 수 있으므로 'happy'를 출력하면 된다. 👨‍💻code import sys from collections import deque def bfs(x, y): q = deque([[x, y]]) visit = [[x, y]] while q: x, y = q.popleft.. 2021. 11. 2.
[프로그래머스] 네트워크 / 파이썬 / Python / DFS 알고리즘 💡solutions ) 💬 DFS 알고리즘, stack 자료형을 사용하여 문제 해결함 💬 computer 한대씩 visit 배열을 통해 방문하지 않았으면 dfs함수를 돌린다 -> 다른 컴퓨터들과의 연결성을 확인하여 연결돼 있으면 stack 배열에 넣어주기 -> 이때 방문했다고 visit배열에 cnt값 할당 💬 한번의 dfs 탐색이 끝난 후 cnt +=1 로 1씩 값을 키워주기 (전체 네트워크가 몇개인지 찾기 위한 카운트) 💬 이때 주의해야 할 점은, cnt = 0부터 시작하면 visit배열에서 0으로 표현된 것들이 계속 존재하기 때문에 무한루프 돌기 때문에 cnt = 1부터 시작하여 마지막 출력에서 -1한 값이 정답이 된다. 👨‍💻code ) def dfs(visit,computers, i, cnt): .. 2021. 10. 24.
[프로그래머스] 게임 맵 최단거리 / 파이썬 / BFS 💡solutions ) 💬 BFS 알고리즘을 통해 최단 경로를 찾는 문제 💬 이때 거리를 찾고, 또 이미 지났던 경로를 다시 방문하지 않기 위해 visit 배열을 만들어서 거리를 저장하기 👨‍💻code ) from collections import deque def solution(maps): answer = 0 dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1] q = deque([(0, 0)]) visit = [[0]*len(maps[0]) for _ in range(len(maps))] visit[0][0] = 1 maps[0][0] = 0 while q: x, y = q.popleft() for k in range(4): nx, ny = x + dx[k], y + dy[k] if 0 2021. 10. 16.
[프로그래머스] 거리두기 확인하기 / 파이썬 / Python / 2021카카오 인턴십 코딩테스트 💡solutions ) 💬 대기실의 각 칸을 하나의 정점으로 보고, 응시자들이 있는 정점을 기준으로 bfs 그래프 탐색을 진행함. 💬 각 정점에서 인접하여 연결된 간선들을 탐색하는데 파티션이 있는 경우는 지나가지 못하고, 거리 2이내의 정점들만 살펴보며 다른 응시자의 유무를 확인함. 💬 이때 지나간 정점은 다시 지나가지 않기 위해 visit 배열을 통해 중복을 체크함. 👨‍💻code ) from collections import deque dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1] # 상하좌우 def bfs(place, i, j): visit = [[0]*5 for _ in range(5)] q = deque() q.append((i, j, 0)) visit[i][j] = 1 w.. 2021. 8. 12.