설명 : BFS(너비 우선 탐색) 알고리즘은 그래프나 트리에서 한 노드로부터 시작하여 인접한 모든 노드를 먼저 방문하는 알고리즘입니다. 이 알고리즘은 큐(queue)를 사용하여 구현됩니다. 큐에는 방문할 노드들이 차례대로 저장되어 있으며, 먼저 들어온 노드를 먼저 방문합니다.

BFS의 구체적인 동작 과정
1. 시작 노드를 큐에 넣고 방문 여부를 표시합니다.
2. 큐가 빌 때까지 다음 과정을 반복합니다.
   - 큐에서 하나의 노드를 꺼냅니다.
   - 해당 노드의 인접한 노드들 중 방문하지 않은 노드들을 큐에 넣고 방문 여부를 표시합니다.
3. 큐가 비면 탐색을 종료합니다.

BFS 알고리즘을 파이썬으로 구현한 예시
--------------------------------------------------------------------------------------------------
from collections import defaultdict, deque

def bfs(graph, start):
    visited = set()  # 방문한 노드를 저장할 집합
    queue = deque([start])  # 큐에 시작 노드를 넣습니다.

    while queue:

        # 큐에서 노드를 하나 꺼냅니다.
        node = queue.popleft()

        # 만약 그 노드가 방문하지 않은것이면
        if node not in visited:
            # 방문한 노드를 집합에 추가합니다.
            visited.add(node) 

            # 현재 노드의 인접한 노드들에 대해
            for neighbor in graph[node]:

           # 방문하지 않은 경우에만 큐에 넣습니다.  
                if neighbor not in visited: 
                    queue.append(neighbor)

#이후  while문 내에서  queue가 popleft에 의해 빌때까지, 반복됨


# 그래프를 인접 리스트로 표현. 리스트를 값으로 가지는 딕셔너리를 생성

# defaultdict(list) 의 동작은 존재하지 않는 키에 접근하면 기본값을 생성하고,

# 기존에 존재하는 키에 대해서는 기본값이 생성되지 않는다.
graph = defaultdict(list)
graph[1] = [2, 3]
graph[2] = [1, 4, 5]
graph[3] = [1, 6]
graph[4] = [2]
graph[5] = [2, 7]
graph[6] = [3]
graph[7] = [5]

# 시작 노드를 1로 설정하고 BFS를 실행합니다.
start_node = 1
print("BFS 탐색 결과:")
bfs(graph, start_node)
--------------------------------------------------------------------------------------------------
이 코드는 다음과 같은 그래프를 탐색하는 BFS 알고리즘입니다.
    1
 /     \ 
2      3   
|  \      \
4  5      6 
     |
    7

자세한 동작
1. 시작 노드 1을 먼저 방문합니다. 그 다음으로, 1과 인접한 노드들인 2와 3이 큐에 순서대로 추가됩니다.
2. 큐에서 노드를 하나씩 꺼내면서 인접한 노드들을 방문합니다. 먼저 2를 꺼내서 방문하고, 2와 인접한 노드들인 1(이미 방문했으므로 제외), 4, 5가 큐에 추가됩니다.
3. 이어서 3을 꺼내서 방문하고, 3과 인접한 노드들인 1(이미 방문했으므로 제외), 6이 큐에 추가됩니다.
4. 그 다음으로 큐에서 4를 꺼내서 방문하고, 4와 인접한 노드는 없으므로 큐에 추가할 노드가 없습니다.
5. 5를 꺼내서 방문하고, 5와 인접한 노드는 2, 7입니다. 그러나 2는 이미 방문한 노드이므로 큐에 추가하지 않고, 7만 큐에 추가됩니다.
6. 마지막으로 6을 꺼내서 방문하고, 6과 인접한 노드인 3(이미 방문했으므로 제외)만 큐에 추가됩니다.
7. 큐에는 더 이상 내용이(방문할 노드) 없으므로 BFS 탐색을 종료합니다.

출력결과
BFS 탐색 결과:
1 2 3 4 5 6 7

이 코드에서는 defaultdict와 deque를 사용하여 간단한 그래프를 표현하고 BFS 알고리즘을 구현하였습니다.

BFS 알고리즘을 적용할 여러 예시
1. **최단 경로 찾기**: 그래프나 트리에서 두 노드 사이의 최단 경로를 찾는 문제에 BFS를 사용할 수 있습니다. 출발 노드로부터 레벨별로 탐색하면서 도착 노드를 찾으면, 그 경로가 최단 경로입니다.

2. **네트워크 탐색**: 컴퓨터 네트워크나 소셜 네트워크에서 특정 사용자와 연결된 모든 사용자를 찾는 문제에 BFS를 사용할 수 있습니다. 특정 사용자로부터 시작하여 친구, 친구의 친구, 그리고 그 이상으로 네트워크를 탐색할 수 있습니다.

3. **미로 찾기**: 미로를 해결하는 문제에 BFS를 사용할 수 있습니다. 시작 지점에서부터 모든 가능한 경로를 탐색하여 도착 지점까지의 최단 경로를 찾을 수 있습니다.

4. **트리의 너비 계산**: 트리에서 각 레벨의 노드 수를 계산하는 문제에 BFS를 사용할 수 있습니다. 루트 노드부터 시작하여 각 레벨의 노드를 탐색하면서 레벨마다 카운트를 증가시킬 수 있습니다.

5. **게임 탐색**: 보드 게임이나 퍼즐 게임에서 가능한 모든 상태를 탐색하는 문제에 BFS를 사용할 수 있습니다. 현재 상태에서 가능한 모든 다음 상태를 찾아내고, 그 상태에서 가능한 모든 다음 상태를 탐색하며 게임을 진행합니다.

6. **컴퓨터 네트워크 라우팅**: 네트워크에서 최적의 경로를 찾는 문제에 BFS를 사용할 수 있습니다. 시작 노드에서부터 모든 경로를 탐색하고, 목적지에 도달할 때까지 가장 짧은 경로를 선택합니다.

7. **최단 경로 게임**: 게임에서 출발점에서 도착점까지 최단 경로로 이동하는 문제에 BFS를 사용할 수 있습니다. 가능한 모든 이동 경로를 탐색하여 최단 경로를 찾을 수 있습니다.

이러한 예시들은 BFS 알고리즘이 다양한 문제에 적용될 수 있음을 보여줍니다. BFS는 탐색하는 과정에서 레벨별로 탐색하기 때문에 최단 경로를 찾거나 네트워크를 탐색하는 등 다양한 문제에 유용하게 사용될 수 있습니다.

'코딩테스트' 카테고리의 다른 글

프로그래머스 오답노트 모음  (0) 2023.12.15

레벨1 문제 난이도 낮은순 배열

1페이지

자연수 뒤집어 배열로 만들기 : reverse sort(reverse=True) 차이

문자열을 정수로 바꾸기 : 파이썬에서 부호인식

정수 사이의 : for 안쓰고 sum(range) 더해줌

서울에서 김서방 찾기 : format 대신 f” 이용한 변수 한번에 삽입

핸드폰 번호 가리기 : 문자열은 특정 인덱스 변경 불가

없는 숫자 더하기 : pass  continue 차이

제일 작은 제거하기 : remove 해당 값의 인덱스 제거

 

2페이지

수박수박수박수박수박수?

내적 : zip 함수는 주로 여러 개의 리스트나 이터러블 객체를 병렬로 처리

문자열 내림차순으로 배치하기

문자열 다루기 기본 : 문자열 숫자도 범위가 있다.

직사각형 별찍기 : map, 넘파이를 이용한 행렬계산

예산 : combinations 시간복잡도는 높은편

삼총사 : combinations 모듈 사용

시저 암호 : 문자열도 범위로 지정할수 있다.

숫자 문자열과 영단어 : for key, value in num_dic.items():

[1] 비밀지도 : format 응용, 2진수 변환과 빈공간 채우기

3페이지

문자열 마음대로 정렬하기 : sorted 이용 이중조건 정렬

뽑아서 더하기 : combinations 사용

푸드 파이트 대회 : 슬라이스 활용

가장 가까운 같은 글자 : dictionaly 사용법

콜라 문제 : 사고문제

추억 점수 : dictionaly 내부 조회 조건문

2016 : datetime 모듈 사용

폰켓몬 : set 관련

과일 장수 : 사고

모의고사 : enumerate : 반복문에서 인덱스와 요소에 동시에 접근

카드 뭉치 : 사고

소수 만들기 : break, continue, pass 의 차이

실패율 : rangelist, lambda의 활용, 리스트 얇은 복사 방법

기사단원의 무기 : 약수 갯수 효율적 알고리즘

[1] 다트 게임 : re.findall 를 활용한 특정 문자열 폼 찾기

로또의 최고 순위와 최저 순위 : count 활용

 

4페이지

체육복 : set(집합) 선언과 index의 활용

완주하지 못한 선수 : 양측의 값의 중복값시 set or dic 의 선택.
둘만의 암호 :
차집합 실습
크레인 인형뽑기 게임 :
스택0 활용문제
신규 아이디 추천 : re.sub
모듈사용법

개인정보 수집 유효기간 : dateutil.relativedelta을 이용한 월차이 계산

신고 결과 받기 : 사전 활용,빈공간 원하는 길이 0으로 채우기,

 

 

레벨2
https://school.programmers.co.kr/learn/courses/30/lessons/42586 : 올림

https://school.programmers.co.kr/learn/courses/30/lessons/12982?language=python3 : 정렬

 

https://school.programmers.co.kr/learn/courses/30/lessons/42746 : 파이썬에서 문자열 정수의 대소비교방법

 

'코딩테스트' 카테고리의 다른 글

BFS 알고리즘 기초  (1) 2024.03.16

+ Recent posts