정화 코딩

EDOC 2023-2 5주차 과제 본문

Group/EDOC

EDOC 2023-2 5주차 과제

jungh150c 2023. 11. 12. 02:43

05-1. 깊이 우선 탐색

 

023. 연결 요소의 개수 (백준 11724번)

 

https://www.acmicpc.net/problem/11724

 

from sys import stdin
import sys

sys.setrecursionlimit(10000)

n, m = map(int, stdin.readline().split())
data = [[] for i in range(n)]
visited = [False] * n

def DFS(v):
    visited[v] = True
    for i in data[v]:
        if not visited[i-1]:
            DFS(i-1)

for i in range(m):
    a, b = map(int, stdin.readline().split())
    data[a-1].append(b)
    data[b-1].append(a)

count = 0

for i in range(n):
    if not visited[i-1]:
        DFS(i-1)
        count += 1

print(count)

 

연결 요소가 뭔지 몰라서 찾아보니 연결 그래프? 쉽게 말해 한 묶음으로 볼 수 있는 것들이 몇 개인지 세면 되는 것 같다. 깊이 우선 탐색으로 새로 시작하는 횟수를 세면 정답! 처음에 sys.setrecursionlimit(10000) 이거 안 써서 런타임 에러 났다. (정답)

 


 

024. 신기한 소수 (백준 2023번)

 

https://www.acmicpc.net/problem/2023

 

from sys import stdin
import sys

sys.setrecursionlimit(10000)

num = int(stdin.readline())
odd = [1, 3, 5, 7, 9]

def isPrime(n):
    for i in range(2, n//2 + 2):
        if n % i == 0:
            return False
    return True


def DFS(n):
    if len(str(n)) == num:
        print(n)
    else:
        for i in odd:
            if isPrime(10*n + i):
                DFS(10*n + i)

DFS(2)
DFS(3)
DFS(5)
DFS(7)

 

(정답)

 


 

025. ABCDE (백준 13023번)

 

https://www.acmicpc.net/problem/13023

 

from sys import stdin
import sys

sys.setrecursionlimit(10000)

n, m = map(int, stdin.readline().split())
data = [[] for i in range(n)]
visited = [False] * n

def DFS(v, depth):
    if depth == 5:
        print(1)
        exit()
    visited[v] = True
    for i in data[v]:
        if not visited[i-1]:
            DFS(i-1, depth+1)
    visited[v] = False # !

for i in range(m):
    a, b = map(int, stdin.readline().split())
    data[a-1].append(b)
    data[b-1].append(a)

for i in range(n):
    if not visited[i-1]:
        DFS(i-1, 1)

print(0)

 

주석으로 느낌표 써둔 저 줄을 꼭 써야 한다!! 이번에 깊이가 5가 되지는 못 했어도 후에 다른 방식으로 깊이 5를 달성할 수 있기 때문인 것 같다. 아마도... (정답)

 


05-2 너비 우선 탐색

 

026. DFS와 BFS (백준 1260번)

 

https://www.acmicpc.net/problem/1260

 

from sys import stdin
from collections import deque

n, m, s = map(int, stdin.readline().split())
data = [[] for i in range(n)]
visited = [False] * n

for i in range(m):
    a, b = map(int, stdin.readline().split())
    data[a-1].append(b)
    data[b-1].append(a)

for i in range(n):
    data[i].sort()

def DFS(v):
    visited[v] = True
    print(v+1, end=" ")
    for i in data[v]:
        if not visited[i-1]:
            DFS(i-1)

def BFS(v):
    que = deque()
    visited[v] = True
    que.append(v+1)
    while que:
        v = que.popleft()
        print(v, end=" ")
        for i in data[v-1]:
            if not visited[i-1]:
                visited[i-1] = True
                que.append(i)

DFS(s-1)

print()
visited = [False] * n

BFS(s-1)

 

(정답)

 


 

027. 미로 탐색 (백준 2178번)

 

https://www.acmicpc.net/problem/2178

 

from sys import stdin
from collections import deque

n, m = map(int, stdin.readline().split())
maze = []
visited = [[False] * m for _ in range(n)]
count = 0
dir = [[1, 0], [-1, 0], [0, 1], [0, -1]]

for i in range(n):
    maze.append(list(map(int, stdin.readline().strip())))

que = deque()

que.append((0, 0))
visited[0][0] = True
while que:
    v = que.popleft()
    for k in range(4):
        x = v[0] + dir[k][0]
        y = v[1] + dir[k][1]
        if x >= 0 and y >= 0 and x < n and y < m:
            if maze[x][y] != 0 and not visited[x][y]:
                que.append((x, y))
                visited[x][y] = True
                maze[x][y] = maze[v[0]][v[1]] + 1

print(maze[n-1][m-1])

 

처음에는 갈 수 있는 길이라는 것을 의미했던 1들에 수를 더해가며 깊이를 표현하는 아이디어가 포인트였던 문제! (정답)

 


 

028. 트리의 지름 (백준 1167번)

 

https://www.acmicpc.net/problem/1167

 

from sys import stdin
from collections import deque

n = int(stdin.readline())
data = [[] for _ in range(n)]

for _ in range(n):
    input = list(map(int, stdin.readline().split()))
    i = 1
    while input[i] != -1:
        data[input[0]-1].append((input[i], input[i+1]))
        i += 2

def BFS(v):
    que = deque()
    visited[v-1] = True
    que.append(v)
    while que:
        v = que.popleft()
        for i in data[v-1]:
            if not visited[i[0]-1]:
                visited[i[0]-1] = True
                que.append(i[0])
                dst[i[0]-1] = dst[v-1] +  i[1]

dst = [0] * n
visited = [False] * n

BFS(2)

maxIndex = 0
for i in range(n):
    if dst[i] > dst[maxIndex]:
        maxIndex = i

dst = [0] * n
visited = [False] * n

BFS(maxIndex+1)
print(max(dst))

 

일단 책에 있는 내용을 읽고 풀긴 했지만 이해는 못 한... (정답)

 

'Group > EDOC' 카테고리의 다른 글

EDOC 2023-2 7회차 정모  (1) 2023.11.27
EDOC 2023-2 6주차 과제  (0) 2023.11.27
EDOC 2023-2 4주차 과제  (0) 2023.11.06
EDOC 2023-2 4회차 정모  (0) 2023.10.09
EDOC 2023-2 3주차 과제  (0) 2023.10.07
Comments