-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
10 changed files
with
335 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,2 @@ | ||
.vscode/extensions.json | ||
연습장.py |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
# https://www.acmicpc.net/problem/12851 | ||
|
||
""" | ||
다른 사람의 아이디어를 참고해서 해결한 문제 | ||
처음에는 최단시간은 bfs로 찾아내고 경로의 개수는 dfs로 찾아내려고 했다. | ||
그렇게 한 결과 시간초과 또는 메모리 초과 판정을 받았다. | ||
구글링한 결과 bfs만으로 해결할 수 있다는 것을 알게되었다. | ||
아이디어는 기존의 bfs는 한번 방문이 되면 다시 큐에 들어가지 않는다는 것을 바꾸는데 있었다. | ||
하지만 우리는 최단 경로의 개수를 구해야하므로 만약 걸린시간이 똑같다면 방문처리가 되어있어도 | ||
다시 큐에 집어넣어서 탐색하고 목표점에 도달하면 카운트를 해주어서 구할 수 있었다. | ||
""" | ||
|
||
import sys | ||
from collections import deque | ||
sys.setrecursionlimit(10**6) | ||
input = sys.stdin.readline | ||
|
||
n,m = map(int,input().split()) | ||
visited = [-1]*100001 | ||
result = 0 | ||
|
||
def bfs(start): | ||
global result | ||
q = deque() | ||
q.append(start) | ||
visited[start] += 1 | ||
|
||
while q: | ||
value = q.popleft() | ||
|
||
if value == m: | ||
result += 1 | ||
continue | ||
|
||
for nx in [value+1,value-1,2*value]: | ||
if 0 <= nx <= 100000 and (visited[nx]==-1 or visited[nx] == visited[value] + 1): # 또 다른 최단 경로를 찾기위해 거리가 같은 경우 큐에 다시 넣어서 탐색하게 함 | ||
q.append(nx) | ||
visited[nx] = visited[value] + 1 | ||
|
||
|
||
bfs(n) | ||
print(visited[m]) | ||
print(result) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
# https://www.acmicpc.net/problem/13549 | ||
|
||
from collections import deque | ||
import sys | ||
input = sys.stdin.readline | ||
|
||
n,k = map(int,input().split()) | ||
visited = [-1]*100001 | ||
|
||
def bfs(): | ||
q = deque() | ||
q.append(n) | ||
visited[n] += 1 | ||
|
||
while q: | ||
value = q.popleft() | ||
|
||
if 0 <= value + 1 <= 100000: | ||
if visited[value + 1] == -1 or visited[value + 1] > visited[value] + 1: | ||
q.append(value + 1) | ||
visited[value + 1] = visited[value] + 1 | ||
|
||
if 0 <= value - 1 <= 100000: | ||
if visited[value - 1] == -1 or visited[value - 1] > visited[value] + 1: | ||
q.append(value - 1) | ||
visited[value - 1] = visited[value] + 1 | ||
|
||
|
||
if 0 <= 2*value <= 100000: | ||
if visited[2*value] == -1 or visited[2*value] > visited[value]: | ||
q.append(2*value) | ||
visited[2*value] = visited[value] | ||
|
||
bfs() | ||
|
||
print(visited[k]) | ||
|
||
|
||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
# https://www.acmicpc.net/problem/2096 | ||
|
||
""" | ||
전형적인 dp문제 하지만 메모리에 제한을 두어 dp테이블을 리스트로 만들어서 쓰지 못했고 | ||
변수를 선언하여 계속 돌려쓰는 방식을 취했다. | ||
""" | ||
import sys | ||
input = sys.stdin.readline | ||
|
||
n = int(input()) | ||
|
||
for i in range(0,n): | ||
x,y,z = map(int,input().split()) | ||
if i == 0: | ||
l,m,r = x,y,z | ||
ll,mm,rr = x,y,z | ||
else: | ||
temp1 = x + max(l,m) | ||
temp2 = y + max(l,m,r) | ||
temp3 = z + max(m,r) | ||
|
||
l,m,r = temp1,temp2,temp3 | ||
|
||
temp1 = x + min(ll,mm) | ||
temp2 = y + min(ll,mm,rr) | ||
temp3 = z + min(mm,rr) | ||
|
||
ll,mm,rr = temp1,temp2,temp3 | ||
|
||
|
||
print(max(l,m,r), min(ll,mm,rr)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
# https://www.acmicpc.net/problem/11660 | ||
|
||
""" | ||
접두사 합을 활용해서 해결했다. | ||
그냥 구간을 정해서 반복문을 돌경우 매번 반복문을 돌아야하기 때문에 시간 초과가 나온다. | ||
개선해야 할점 나는 행을 기준으로만 접두사 합을 구했지만 행과 열 모두 고려해서 접두사 합을 | ||
구현한다면 좀더 효율적으로 해결할 수 있을 것이다.(적용완료) | ||
""" | ||
|
||
import sys | ||
from pprint import pprint | ||
input = sys.stdin.readline | ||
|
||
n,m = map(int,input().split()) | ||
|
||
maps = [list(map(int,input().split())) for _ in range(n)] | ||
|
||
dp = [[0]*(n+1) for _ in range(n+1)] | ||
|
||
for i in range(1,n+1): | ||
for j in range(1,n+1): | ||
dp[i][j] = dp[i][j-1] + maps[i-1][j-1] | ||
|
||
for i in range(1,n+1): | ||
for j in range(1,n+1): | ||
dp[j][i] = dp[j-1][i] + dp[j][i] | ||
|
||
for i in range(m): | ||
x1,y1,x2,y2 = map(int,input().split()) | ||
|
||
print(dp[x2][y2]-dp[x1-1][y2]-dp[x2][y1-1]+dp[x1-1][y1-1]) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
# https://www.acmicpc.net/problem/5639 | ||
|
||
""" | ||
다른 사람의 아이디어를 참고해서 해결한 문제 | ||
처음에는 전위순회로 트리를 구현해서 문제를 풀었는데 시간초과가 났다. | ||
전위순회의 특징을 고려해서 재귀로 구현해야했다. | ||
전위순회로 얻은 리스트의 첫번째는 루트 노드이고 루트노드보다 작은 것들은 왼쪽 서브트리 | ||
루트노드보다 큰 것들은 오른쪽 서브트리를 구성하고 있으므로 이를 이용해서 재귀적으로 순회를 구현하면 된다. | ||
""" | ||
|
||
import sys | ||
sys.setrecursionlimit(10**7) | ||
|
||
node_list = [] | ||
|
||
while True: | ||
try: | ||
node_list.append(int(sys.stdin.readline())) | ||
except: | ||
break | ||
|
||
def postorder(start,end): | ||
if start > end: | ||
return | ||
|
||
root = node_list[start] | ||
mid = end + 1 # mid의 초기값은 오른쪽 서브트리가 없다고 가정 | ||
|
||
for i in range(start+1, end+1): # 루트보다 큰 값을 mid값으로 설정하기위한 반복문 | ||
if node_list[i] > root: | ||
mid = i | ||
break | ||
|
||
postorder(start+1,mid-1) | ||
postorder(mid,end) | ||
print(root) | ||
|
||
postorder(0,len(node_list)-1) | ||
|
||
|
||
|
||
|
||
# import sys | ||
# sys.setrecursionlimit(10**7) | ||
|
||
# node_list = [] | ||
# tree = dict() | ||
|
||
# while True: | ||
# try: | ||
# num = int(sys.stdin.readline()) | ||
# node_list.append(num) | ||
# except: | ||
# break | ||
|
||
# def make_tree(root,node): | ||
# if root > node: | ||
# if tree[root][0] == 0: | ||
# tree[root][0] = node | ||
# tree[node] = [0,0] | ||
# else: | ||
# make_tree(tree[root][0],node) | ||
# elif root < node: | ||
# if tree[root][1] == 0: | ||
# tree[root][1] = node | ||
# tree[node] = [0,0] | ||
# else: | ||
# make_tree(tree[root][1],node) | ||
|
||
# def postorder(node): | ||
# left,right = tree[node][0],tree[node][1] | ||
# if left != 0: | ||
# postorder(left) | ||
# if right != 0: | ||
# postorder(right) | ||
# print(node) | ||
|
||
# tree[node_list[0]] = [0,0] | ||
|
||
# for node in node_list[1:]: | ||
# make_tree(node_list[0],node) | ||
|
||
# postorder(node_list[0]) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
# https://www.acmicpc.net/problem/15686 | ||
|
||
""" | ||
bfs를 활용해서 해결했지만 치킨집과 집의 거리를 구하는 방법은 굳이 bfs를 사용할 필요가 없었다. | ||
최소거리라는 말을 듣고 bfs만을 떠올렸는데 다른 방법도 있다는 것을 명심해야한다. | ||
bfs 이용하지 않는 방법으로 업데이트 했음 | ||
""" | ||
import sys | ||
from itertools import combinations | ||
input = sys.stdin.readline | ||
|
||
n,m = map(int,input().split()) | ||
graph = [list(map(int,input().split())) for _ in range(n)] | ||
chick = [] | ||
houses = [] | ||
result = int(1e9) | ||
|
||
for i in range(n): | ||
for j in range(n): | ||
if graph[i][j] == 2: | ||
chick.append((i,j)) | ||
elif graph[i][j] == 1: | ||
houses.append((i,j)) | ||
|
||
combs = combinations(chick, m) | ||
|
||
for comb in combs: | ||
sum = 0 | ||
for house_x, house_y in houses: | ||
temp = int(1e9) | ||
for chick_x, chick_y in comb: | ||
temp = min(temp, abs(house_x - chick_x) + abs(house_y-chick_y)) | ||
sum += temp | ||
result = min(result,sum) | ||
|
||
print(result) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
# https://www.acmicpc.net/problem/1991 | ||
|
||
n = int(input()) | ||
|
||
tree = dict() | ||
|
||
for i in range(n): | ||
p,l,r = input().split() | ||
tree[p] = [l,r] | ||
|
||
# 전위 순회 함수 | ||
def pretrav(start): | ||
left = tree[start][0] | ||
right = tree[start][1] | ||
print(start, end="") | ||
if left != '.': | ||
pretrav(left) | ||
if right != '.': | ||
pretrav(right) | ||
|
||
# 중위 순회 함수 | ||
def intrav(start): | ||
left = tree[start][0] | ||
right = tree[start][1] | ||
if left != '.': | ||
intrav(left) | ||
print(start, end="") | ||
if right != '.': | ||
intrav(right) | ||
|
||
# 후위 순회 함수 | ||
def posttrav(start): | ||
left = tree[start][0] | ||
right = tree[start][1] | ||
if left != '.': | ||
posttrav(left) | ||
if right != '.': | ||
posttrav(right) | ||
print(start, end="") | ||
|
||
pretrav('A') | ||
print() | ||
intrav('A') | ||
print() | ||
posttrav('A') |