본문 바로가기

Algorithm/DFS and BFS

(9)
인구 이동 문제 유형 파악 및 구현 이 문제 또한 차분하게 풀 필요가 있는 문제이다. BFS를 통해 조건에 맞는 노드들을 그룹짓고 마지막에 변환해주는 간단한 프로그램이지만 고려해야될 부분이 많아 약간 시간을 썼던 것 같다. 이런 문제는 항상 느끼는 거지만 급하지 않게 차분히 하는게 중요하다. 코드 n, min_value, max_value = map(int, input().split()) graph = [] for i in range(n): graph.append(list(map(int,input().split()))) from collections import deque dx = [-1, 0, 1, 0] dy = [0, -1 ,0, 1] real_count = 0 while(1): again_check = Fal..
감시 피하기 유형 파악 및 분석 이 문제는 내 생각엔 구현이 까다로워 구현문제에 가까운 것 같다. 정리를 해보자면 까다로운 구현 + BFS를 통한 감시정도 되는 것 같다. 차분히 구현해야 하며, 구현 과정을 정리하면 아래와 같다. 1. 입력 받음과 동시에, 나중에 맵 초기화를 위한 선생위치, 학생위치, 빈칸위치를 리스트에 담아둔다. 2. 조합을 통해 빈칸위치들 중에서 장애물의 조합을 구한다. 3. 장애물마다 설치하고 감시하고 장애물을 해체하는 과정을 반복한다. 4. 감시 과정은 미리 담아둔 선생위치를 하나씩 꺼내 확인한다. 감시는 학생 발견시 return True를 때려 하던 과정 멈추고 다음 장애물을 확인하기 위해 넘어가게 설정해 두었다. 코드 graph = [] x_pos = [] t_pos = [] s_pos ..
괄호변환 이 문제는 DFS나 BFS를 사용하기 보단 구현, 재귀함수와 가까운 듯 하다. 코드내에 간단한 조건들과 구현을 정리해보았다. 코드 # 올바른 문자열인지 확인해주는 함수 def test1(array): count = 0 for i in array: if i == "(": count += 1 else: count -= 1 if count < 0: return False return True # 메인 함수 def solution(array): # 길이가 0이면 그대로 반환 if len(array) == 0: return "" # 해당 문자열이 균형잡혔는지 확인 count1,count2 = 0, 0 for i in range(len(array)): if array[i] == "(": count1 += 1 els..
경쟁적 전염 문제 1부터 K까지 번호가 있는 바이러스가 K 있을 때, N크기의 맵에서 바이러스가 증식한다. 유형 - 일종의 퍼진다 개념이다. - 노드와 간선의 개념이다. - 그래프에서 연결된 노드 집합 구하는 것과 유사하다. 구현 - 입력을 받을때, 바이러스 초기시간(0초), 위치, 값을 처리한다. - 이 후, 값을 작은 순서대로 정렬한다. -> 번호가 작은 순서대로 증식하기 때문에 - 큐에 넣는다. - 선입부터 쭉쭉 꺼낸다. - 만약 꺼낸 데이터의 시간이 기준 시간보다 같다면 멈춘다. - 꺼낸 데이터를 상하좌우 따져서 범위 안인지 확인한다. - 범위 안이면 숫자로 방문처리, 큐에 삽입, (삽입시 현재 시간 + 1 해야한다.) 코드 from collections import deque n, k = map(int, i..
연구소 문제 0 - 빈칸, 1 - 벽, 2 - 바이러스일 때, 바이러스는 상하좌우로 0이 있으면 그 길을 통해 퍼진다. 이 때 벽을 3개 세워 바이러스를 막을 때, 바이러스가 아닌 부분의 최대 개수 (안전영역) 유형 분석 - 그래프와 연결된 모든 노드를 구해서 바이러스가 퍼지는 유형 -> DFS 벽을 세우는 경우의 수 : combinations 바이러스 처리 : DFS or BFS 코드 # 연구소 from itertools import combinations dx = [-1, 0, 1, 0] dy = [0, -1, 0, 1] def virus(x, y, test): for k in range(4): now_x = x + dx[k] now_y = y + dy[k] if now_x = n ..
특정 거리의 도시 찾기 문제 노드의 수(N), 간선의 수 (M), 출발 도시의 번호(X) 가 주어질 때, 노드 X로 부터 거리가 K인 노드 번호를 모두 구하라. 유형 분석 및 해결 - 노드와 간선 그래프이다. - 거리가 모두 1이다. - 특정노드와 거리가 k인 노드 -> BFS 코드 from collections import deque def solution(n, k, x, array): distance = [-1]*(n+1) distance[x] = 0 queue = deque() queue.append(x) while queue: now= queue.popleft() for i in array[now]: if distance[i] == -1: distance[i] = distance[now] + 1 queue.append(..
미로탈출 문제 1 - 가능한 위치, 0 - 괴물일 때, (0, 0)에서 (n, m)까지 이동하는데 가장 짧은 거리 유형 파악 그래프가 주어지고 특정 노드의 위치를 탐색하는 것이므로 우선, BFS/DFS 이다. 코드 dx = [-1, 0, 1, 0] dy = [0, -1, 0, 1] from collections import deque def bfs(array, visited, start): visited[start[0]][start[1]] = True queue = deque() queue.append(start) while queue: x, y = queue.popleft() for i in range(4): next_x = x + dx[i] next_y = y + dy[i] if next_x < 0 or ne..
음료수 얼려먹기 문제 구멍 : 0, 칸막이 : 1 구멍이 뚫려있는 부분끼리 상하좌우로 붙어있는 경우 서로 연결되어 아이스크림 생성 아이스크림의 수는? 유형 파악 우선 아이스크림을 만들려면 연결된 노드들을 파악하다가 더이상 연결된 노드들을 찾을 수 없을 때 아이스크림 하나가 생긴다. 따라서, 연결된 모든 노드들을 탐색할 수 있는 DFS/BFS를 사용할 수 있는데, 둘 다 사용이 가능하다. 코드 def dfs(array, visited, start): x = start[0] y = start[1] visited[x][y] = True dx = [-1, 0, 1, 0] dy = [0, -1, 0, 1] for i in range(4): next_x = x+dx[i] next_y = y+dy[i] if 0