def dfs(graph, v, visited):
# 현재 노드를 방문 처리
visited[v] = True
print(v, end=' ')
# 현재 노드와 연결된 다른 노드를 재귀적으로 방문
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)
# 2차원 리스트로 각 노드가 연결된 정보를 표현
graph = [
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
# 각 노드가 방문된 정보를 표현 (1차원 리스트)
visited = [False] * 9
# 정의된 DFS 함수 호출
dfs(graph, 1, visited)
#include <iostream>
#include <vector>
using namespace std;
bool visited[9];
vector<int> graph[9];
// DFS 함수 정의
void dfs(int x)
{
// 현재 노드를 방문 처리
visited[x] = true;
cout << x << ' ';
// 현재 노드와 연결된 다른 노드를 재귀적으로 방문
for (int i = 0; i < graph[x].size(); i++)
{
int y = graph[x][i];
if (!visited[y])
dfs(y);
}
}
int main(void)
{
// 노드 1에 연결된 노드 정보 저장
graph[1].push_back(2);
graph[1].push_back(3);
graph[1].push_back(8);
// 노드 2에 연결된 노드 정보 저장
graph[2].push_back(1);
graph[2].push_back(7);
// 노드 3에 연결된 노드 정보 저장
graph[3].push_back(1);
graph[3].push_back(4);
graph[3].push_back(5);
// 노드 4에 연결된 노드 정보 저장
graph[4].push_back(3);
graph[4].push_back(5);
// 노드 5에 연결된 노드 정보 저장
graph[5].push_back(3);
graph[5].push_back(4);
// 노드 6에 연결된 노드 정보 저장
graph[6].push_back(7);
// 노드 7에 연결된 노드 정보 저장
graph[7].push_back(2);
graph[7].push_back(6);
graph[7].push_back(8);
// 노드 8에 연결된 노드 정보 저장
graph[8].push_back(1);
graph[8].push_back(7);
dfs(1);
}
from collections import deque
def bfs(graph, start, visited):
# 방문할 노드를 저장할 큐
queue = deque([start])
# 첫 번째 노드 방문 처리
visited[start] = True
# 큐가 빌 때까지 아래의 과정 반복
while queue:
# 큐에서 하나의 원소를 뽑아 출력(방문)
v = queue.popleft()
print(v, end=' ')
# 연결된 노드 중 아직 방문하지 않은 인접한 원소들을 큐에 삽입
for i in graph[v]:
if not visited[i]:
queue.append(i)
visited[i] = True
# 그래프의 연결 정보를 2차원 리스트로 표현
graph = [
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
# 각 노드의 방문 여부를 1차원 리스트로 표현
visited = [False] * 9
# 정의된 BFS 함수 호출
bfs(graph, 1, visited)
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
bool visited[9];
vector<int> graph[9];
void bfs(int start)
{
queue<int> q;
q.push(start);
visited[start] = true;
while (!q.empty())
{
int x = q.front();
q.pop();
cout << x << ' ';
for (int i = 0; i < graph[x].size(); i++)
{
int y = graph[x][i];
if (!visited[y])
{
q.push(y);
visited[y] = true;
}
}
}
}
int main(void)
{
// 노드 1에 연결된 노드 정보 저장
graph[1].push_back(2);
graph[1].push_back(3);
graph[1].push_back(8);
// 노드 2에 연결된 노드 정보 저장
graph[2].push_back(1);
graph[2].push_back(7);
// 노드 3에 연결된 노드 정보 저장
graph[3].push_back(1);
graph[3].push_back(4);
graph[3].push_back(5);
// 노드 4에 연결된 노드 정보 저장
graph[4].push_back(3);
graph[4].push_back(5);
// 노드 5에 연결된 노드 정보 저장
graph[5].push_back(3);
graph[5].push_back(4);
// 노드 6에 연결된 노드 정보 저장
graph[6].push_back(7);
// 노드 7에 연결된 노드 정보 저장
graph[7].push_back(2);
graph[7].push_back(6);
graph[7].push_back(8);
// 노드 8에 연결된 노드 정보 저장
graph[8].push_back(1);
graph[8].push_back(7);
bfs(1);
}
# 음료수 얼려 먹기 문제
# dfs를 이용해 주변의 0인 노드를 탐색하고 방문하는 함수
def dfs(x, y):
# 주어진 범위를 벗어나는 경우에는 즉시 종료
if x <= -1 or x >= n or y <= -1 or y >= m:
return False
# 현재 노드가 0 이라면
if graph[x][y] == 0:
# 해당 노드를 1로 바꾸고 상하좌우 연결된 0인 노드도 모두 1로 바꾸기
graph[x][y] = 1
# 상 하 좌 우 모두 확인
dfs(x, y - 1)
dfs(x, y + 1)
dfs(x - 1, y)
dfs(x + 1, y)
return True
# 현재 노드가 1 이라면 False
return False
# n, m 입력
n, m = map(int, input().split())
# 얼음틀의 형태를 2차원 리스트로 저장
graph = []
for i in range(n):
graph.append(list(map(int, input())))
# 모든 노드를 탐색하면서
# 해당 노드가 0 이라면 -> 연결된 0 노드를 모두 1로 바꾸고 result += 1
# 해당 노드가 1 이라면 -> pass
result = 0
for i in range(n):
for j in range(m):
# 현재 위치에서 DFS 수행
if dfs(i, j) == True:
result += 1
print(result)
# 미로 탈출
from collections import deque
# n, m 입력
n, m = map(int, input().split())
# 2차원 리스트의 맵 정보 입력 받기
graph = []
for i in range(n):
graph.append(list(map(int, input())))
# 상하좌우 방향벡터
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
queue = deque()
queue.append((0, 0))
while queue:
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 graph[nx][ny] == 0:
continue
# 해당 노드를 처음 방문하는 경우에만 최단 거리 기록
if graph[nx][ny] == 1:
graph[nx][ny] = graph[x][y] + 1
queue.append((nx, ny))
# 가장 오른쪽 아래의 최단 거리 출력
print(graph[n-1][m-1])
# DFS와 BFS
from collections import deque
# 1. n, m, v 입력
n, m, v = map(int, input().split())
# 2. 간선 입력 & 그래프 생성
# 2차원 리스트 초기화
graph = [[] for _ in range(n + 1)] # n + 1개의 행을 가지는 2차원 리스트
# m개의 간선 정보 입력
for _ in range(m):
node1, node2 = map(int, input().split())
graph[node1].append(node2)
graph[node2].append(node1)
# 입력된 정보 정렬
for row in graph:
row.sort()
# 3. BFS 수행 결과 출력
def dfs(graph, v, visited):
# 현재 노드를 방문 처리
visited[v] = True
print(v, end=' ')
# 현재 노드와 연결된 다른 노드를 재귀적으로 방문
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)
# 각 노드가 방문된 정보를 표현 (1차원 리스트)
visited = [False] * (n+1)
# 정의된 DFS 함수 호출
dfs(graph, v, visited)
print()
# 4. BFS 수행 결과 출력
def bfs(graph, start, visited):
# 방문할 노드를 저장할 큐
queue = deque([start])
# 첫 번째 노드 방문 처리
visited[start] = True
# 큐가 빌 때까지 아래의 과정 반복
while queue:
# 큐에서 하나의 원소를 뽑아 출력(방문)
v = queue.popleft()
print(v, end=' ')
# 연결된 노드 중 아직 방문하지 않은 인접한 원소들을 큐에 삽입
for i in graph[v]:
if not visited[i]:
queue.append(i)
visited[i] = True
# 각 노드의 방문 여부를 1차원 리스트로 표현
visited = [False] * (n+1)
# 정의된 BFS 함수 호출
bfs(graph, v, visited)
print()
n, m, v 입력
n, m, v = map(int, input().split())
간선 입력 & 그래프 생성
# 2차원 리스트 초기화
graph = [[] for _ in range(n + 1)] # n + 1개의 행을 가지는 2차원 리스트
# m개의 간선 정보 입력
for _ in range(m):
node1, node2 = map(int, input().split())
graph[node1].append(node2)
graph[node2].append(node1)
# 입력된 정보 정렬
for row in graph:
row.sort()
2차원 리스트 초기화
→ (노드의 개수 + 1)개 만큼의 행을 가지는 2차원 리스트를 초기화한다.
m개의 간선 정보 입력
입력된 정보 정렬
→ 번호가 작은 노드부터 방문해야 하므로 오름차순으로 정렬한다.
DFS 수행 결과 출력
def dfs(graph, v, visited):
# 현재 노드를 방문 처리
visited[v] = True
print(v, end=' ')
# 현재 노드와 연결된 다른 노드를 재귀적으로 방문
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)
# 각 노드가 방문된 정보를 표현 (1차원 리스트)
visited = [False] * (n+1)
# 정의된 DFS 함수 호출
dfs(graph, v, visited)
print()
BFS 수행 결과 출력
def bfs(graph, start, visited):
# 방문할 노드를 저장할 큐
queue = deque([start])
# 첫 번째 노드 방문 처리
visited[start] = True
# 큐가 빌 때까지 아래의 과정 반복
while queue:
# 큐에서 하나의 원소를 뽑아 출력(방문)
v = queue.popleft()
print(v, end=' ')
# 연결된 노드 중 아직 방문하지 않은 인접한 원소들을 큐에 삽입
for i in graph[v]:
if not visited[i]:
queue.append(i)
visited[i] = True
# 각 노드의 방문 여부를 1차원 리스트로 표현
visited = [False] * (n+1)
# 정의된 BFS 함수 호출
bfs(graph, v, visited)
print()
# 단지 번호 붙이기
def dfs(x, y):
# 주어진 범위를 벗어나는 경우에는 즉시 종료
if x <= -1 or x >= n or y <= -1 or y >= n:
return False
# 현재 노드가 0 이라면
if graph[x][y] == 1:
# 해당 노드를 1로 바꾸고 상하좌우 연결된 0인 노드도 모두 1로 바꾸기
graph[x][y] = 0
house_count[complex_index] += 1
# 상 하 좌 우 모두 확인
dfs(x, y - 1)
dfs(x, y + 1)
dfs(x - 1, y)
dfs(x + 1, y)
return True
# 현재 노드가 1 이라면 False
return False
# n
n = int(input())
# 얼음틀의 형태를 2차원 리스트로 저장
graph = []
for i in range(n):
graph.append(list(map(int, input())))
complex_count = 0 # 단지 수 카운트
house_count = [0] * 25 * 25 # 각 단지의 집 수(최대 25^2개까지 가능)
complex_index = 0 # 각 단지의 번호 -> 각 단지의 집 수를 카운트 하는 용도
for i in range(n):
for j in range(n):
# 현재 위치에서 DFS 수행
if dfs(i, j) == True:
complex_count += 1
complex_index += 1 # 그 다음 단지를 이용하기 위해
print(complex_count)
house_count = house_count[:complex_index]
house_count.sort()
for i in range(complex_index):
print(house_count[i])
음료수 얼려먹기에서 수정한 내용