Skip to content

Commit 17f5542

Browse files
committed
문제 추가
1 parent eacd5e7 commit 17f5542

36 files changed

+1248
-1
lines changed

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,4 @@
1-
# 안녕하세요
1+
# 알고리즘 문제 목록
2+
3+
### 다시 풀어봐야하는 문제
4+
...

UnionFind/친구_네트워크.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# https://www.acmicpc.net/problem/4195
2+
3+
"""
4+
다른 사람의 아이디어를 참고한 문제
5+
다른 부분의 로직은 내가 직접 구현한게 맞았지만 사람의 수를 세는 것에서 시간초과가 났다.
6+
처음에는 parent배열에서 같은 부모를 가지는 것들을 조회해서 카운트 했기 때문에 반복문 마다 시행하게 되면 시간복잡도가 O(n^2)이 된다.
7+
8+
해결방법은 새로운 딕셔너리를 이용하는 것이었다.(다른 사람의 아이디어 참고)
9+
union함수를 시행할 때 마다 각각의 집합의 갯수를 더하는 방법을 통해 일일이 조회하지 않고도 사람의 수를 카운트 할 수 있다.
10+
"""
11+
12+
import sys
13+
n = int(sys.stdin.readline().rstrip())
14+
15+
# x는 문자열임
16+
def find_parent(parent,x):
17+
if parent[x] != x:
18+
parent[x] = find_parent(parent,parent[x])
19+
return parent[x]
20+
21+
def union(a,b,parent):
22+
a = find_parent(parent,a)
23+
b = find_parent(parent,b)
24+
25+
if a > b:
26+
parent[a] = b
27+
cnt[b] += cnt[a]
28+
return b
29+
elif a < b:
30+
parent[b] = a
31+
cnt[a] += cnt[b]
32+
return a
33+
else:
34+
return a
35+
36+
for i in range(n):
37+
m = int(sys.stdin.readline().rstrip())
38+
parent = {}
39+
cnt = {}
40+
for j in range(m):
41+
a,b = sys.stdin.readline().rstrip().split()
42+
if a not in parent.keys():
43+
parent[a] = a
44+
cnt[a] = 1
45+
if b not in parent.keys():
46+
parent[b] = b
47+
cnt[b] = 1
48+
x = union(a,b,parent)
49+
50+
print(cnt[x])

그래프/경로_찾기.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# https://www.acmicpc.net/problem/11403
2+
3+
"""
4+
플로이드 워셜 알고리즘을 응용해서 해결 할 수 있었던 문제
5+
새로 알아간것은 자기자신에 출발해서 자기자신으로 돌아가는 부분은 거리를 주어질때 음수만 아니면 다른 부분에 영향을 안미친다.
6+
"".join()의 경우 매개변수로 iterable한 객체가 들어가야 되고 ""안에는 구분자를 넣어준다 _를 넣으면 중간에 원소 중간중간에 _를 넣어 반환
7+
"""
8+
9+
import sys
10+
from pprint import pprint
11+
12+
n = int(input())
13+
graph = [sys.stdin.readline().split() for _ in range(n)]
14+
15+
for k in range(n):
16+
for i in range(n):
17+
for j in range(n):
18+
if graph[i][k] == '1' and graph[k][j] == '1':
19+
graph[i][j] = '1'
20+
21+
for i in range(n):
22+
print(" ".join(graph[i]))

그래프/순위.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# https://school.programmers.co.kr/learn/courses/30/lessons/49191
2+
3+
# 다른 사람의 아이디어를 보고 해결한 문제
4+
# 순위 결정되는 조건을 파악하지 못했다.
5+
# 왜 파악하지 못했나?
6+
# 기본적인 조건을 보기보다 어떤 그래프 알고리즘을 적용할지 고민했다.
7+
# 먼저 예시를 도식화하여 당연한 것이라고 생각할지라도 명확하게 정리해야한다.
8+
# 순위가 결정되려면 모든 인원에 관한 승패기록이 존재해야함
9+
# a가 b를 이기고 b가 c를 이기면 a는 c를 이긴 것이됨
10+
# 이렇게 직접적으로 결과가 주어지진 않은 것들도 승패 기록을 찾아내려면 플로이드 워셜을 사용하면 됨
11+
# 이긴것만 기록 하면 되느냐? 아니다 진것도 기록을 해야한다.
12+
13+
from pprint import pprint
14+
15+
def solution(n, results):
16+
INF = int(1e9)
17+
graph = [[0] * (n+1) for _ in range(n+1)]
18+
19+
for a,b in results:
20+
graph[a][b] = 1
21+
graph[b][a] = -1
22+
23+
for i in range(1,n+1):
24+
for j in range(1, n+1):
25+
if i == j:
26+
graph[i][j] = 1
27+
28+
pprint(graph)
29+
30+
for k in range(1,n+1):
31+
for i in range(1,n+1):
32+
for j in range(1,n+1):
33+
if graph[i][k] == 1 and graph[k][j] == 1:
34+
graph[i][j] = 1
35+
elif graph[i][k] == -1 and graph[k][j] == -1:
36+
graph[i][j] = -1
37+
38+
answer = 0
39+
40+
pprint(graph)
41+
42+
for i in range(1,n+1):
43+
if 0 in graph[i][1:]:
44+
continue
45+
answer += 1
46+
47+
48+
return answer

그래프/여행_가자.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# https://www.acmicpc.net/problem/1976
2+
3+
"""
4+
유니온 파인드를 활용해서 해결한 문제
5+
인접 행렬로는 데이터를 받은 것은 오랜만이라 살짝 헤멨었음
6+
인접 행렬로 구현하는 것도 가끔 시도해봐야겠다.
7+
"""
8+
9+
def find_parent(parent,x):
10+
if parent[x] != x:
11+
parent[x] = find_parent(parent,parent[x])
12+
return parent[x]
13+
14+
def union(a,b,parent):
15+
a = find_parent(parent,a)
16+
b = find_parent(parent,b)
17+
18+
if a > b:
19+
parent[a] = b
20+
elif a < b:
21+
parent[b] = a
22+
23+
24+
n = int(input())
25+
m = int(input())
26+
27+
parent = [0]*(n+1)
28+
29+
for i in range(n+1):
30+
parent[i]=i
31+
32+
graph = [list(map(int,input().split())) for _ in range(n)]
33+
34+
for i in range(n):
35+
for j in range(n):
36+
if graph[i][j] == 1:
37+
union(i+1,j+1,parent)
38+
39+
plans = list(map(int,input().split()))
40+
41+
for i in range(1,n+1):
42+
find_parent(parent,i)
43+
44+
temp = []
45+
for city in plans:
46+
temp.append(parent[city])
47+
48+
temp = set(temp)
49+
50+
if len(temp) == 1:
51+
print('YES')
52+
else:
53+
print('NO')

그래프/집합의_표현.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# https://www.acmicpc.net/problem/1717
2+
3+
"""
4+
유니온 파인드 기본 개념 문제
5+
구현할 수 있는지를 물어봄
6+
"""
7+
8+
import sys
9+
sys.setrecursionlimit(10**6)
10+
11+
n,m = map(int,input().split())
12+
13+
parent = [0]*(n+1)
14+
15+
for i in range(n+1):
16+
parent[i]=i
17+
18+
orders = [list(map(int,sys.stdin.readline().split())) for _ in range(m)]
19+
20+
def find_parent(parent,x):
21+
if parent[x] != x:
22+
parent[x] = find_parent(parent,parent[x])
23+
return parent[x]
24+
25+
def union(a,b,parent):
26+
a = find_parent(parent,a)
27+
b = find_parent(parent,b)
28+
if a > b:
29+
parent[a] = b
30+
elif a < b:
31+
parent[b] = a
32+
33+
for order in orders:
34+
if order[0] == 0:
35+
union(order[1],order[2],parent)
36+
else:
37+
if find_parent(parent,order[1]) == find_parent(parent,order[2]):
38+
print("yes")
39+
else:
40+
print('no')

그래프/최소비용_구하기.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# https://www.acmicpc.net/problem/1916
2+
3+
# 전형적인 다익스트라 문제
4+
# 다익스트라를 구현하는데 힙에서 빼온 노드의 거리가 distance리스트에 있는 거리보다 클경우 무시해야한다는 조건을
5+
# 떠올리지 못해 시간초과가 났었다.
6+
7+
import heapq
8+
import sys
9+
INF = int(1e9)
10+
11+
n = int(sys.stdin.readline())
12+
m = int(sys.stdin.readline())
13+
graph = [[] for _ in range(n+1)]
14+
15+
for i in range(m):
16+
a,b,dist = map(int,sys.stdin.readline().split())
17+
graph[a].append((b,dist))
18+
19+
start, end = map(int,sys.stdin.readline().split())
20+
distance = [INF] * (n+1)
21+
22+
def dijkstra(start):
23+
24+
distance[start] = 0
25+
26+
heap = []
27+
heapq.heappush(heap,(0,start))
28+
29+
while heap:
30+
dist, city = heapq.heappop(heap)
31+
32+
if dist > distance[city]:
33+
continue
34+
for node in graph[city]:
35+
new_distance = dist + node[1]
36+
if new_distance < distance[node[0]]:
37+
distance[node[0]] = new_distance
38+
heapq.heappush(heap,(distance[node[0]],node[0]))
39+
40+
dijkstra(start)
41+
print(distance[end])

깊이or너비 우선 탐색/A->B.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# https://www.acmicpc.net/problem/16953
2+
3+
"""
4+
bfs적용했지만 메모리 초과가 났던 문제
5+
방문을 처리하기 위해 목표 숫자의 최댓값 크기의 리스트를 선언했는데 그 크기가 너무 컸기 때문임
6+
그래서 방문처리를 하기위해
7+
"""
8+
9+
from collections import deque,defaultdict
10+
11+
a,b = map(int,input().split())
12+
visited = []
13+
cal_cnt = defaultdict(lambda: -1)
14+
15+
def bfs(start):
16+
q = deque()
17+
q.append(start)
18+
visited.append(start)
19+
cal_cnt[start] = 1
20+
21+
while q:
22+
value = q.popleft()
23+
24+
num = 2*value
25+
if num <= b and num not in visited:
26+
q.append(num)
27+
cal_cnt[num] = cal_cnt[value] + 1
28+
29+
num = 10*value + 1
30+
if num <= b and num not in visited:
31+
q.append(num)
32+
cal_cnt[num] = cal_cnt[value] + 1
33+
34+
bfs(a)
35+
print(cal_cnt[b])
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# https://school.programmers.co.kr/learn/courses/30/lessons/159993
2+
3+
"""
4+
조건이 존재하는 전형적인 최단 거리 탐색 문제였다.
5+
"""
6+
7+
from collections import deque
8+
9+
def solution(maps):
10+
answer = 0
11+
n = len(maps)
12+
m = len(maps[0])
13+
14+
for i in range(n):
15+
for j in range(m):
16+
if maps[i][j] == 'L':
17+
lever_x = i
18+
lever_y = j
19+
elif maps[i][j] == 'E':
20+
exit_x = i
21+
exit_y = j
22+
elif maps[i][j] == 'S':
23+
start_x = i
24+
start_y = j
25+
26+
distance = bfs(start_x,start_y,n,m,maps)
27+
28+
if distance[lever_x][lever_y] == -1 or distance[exit_x][exit_y] == -1:
29+
return -1
30+
31+
answer += distance[lever_x][lever_y]
32+
33+
distance = bfs(lever_x,lever_y,n,m,maps)
34+
35+
answer += distance[exit_x][exit_y]
36+
37+
38+
return answer
39+
40+
def bfs(a,b,n,m,maps):
41+
visited = [[-1]*m for _ in range(n)]
42+
q = deque()
43+
q.append((a,b))
44+
visited[a][b] = 0
45+
46+
dx = [1,0,-1,0]
47+
dy = [0,1,0,-1]
48+
49+
while q:
50+
x,y = q.popleft()
51+
52+
for i in range(4):
53+
nx = x + dx[i]
54+
ny = y + dy[i]
55+
if 0<= nx < n and 0 <= ny < m:
56+
if maps[nx][ny] != 'X' and visited[nx][ny] == -1:
57+
q.append((nx,ny))
58+
visited[nx][ny] = visited[x][y] + 1
59+
return visited
60+
61+
62+
63+
64+
65+
66+
67+
68+
69+
70+
71+
72+
73+
74+
75+

0 commit comments

Comments
 (0)