Skip to content

Commit

Permalink
해결문제 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
ZeVicTech committed Apr 8, 2023
1 parent c53b992 commit f5b5afe
Show file tree
Hide file tree
Showing 10 changed files with 335 additions and 2 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
.vscode/extensions.json
연습장.py
2 changes: 1 addition & 1 deletion 그래프/경로_찾기.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

"""
플로이드 워셜 알고리즘을 응용해서 해결 할 수 있었던 문제
새로 알아간것은 자기자신에 출발해서 자기자신으로 돌아가는 부분은 거리를 주어질때 음수만 아니면 다른 부분에 영향을 안미친다.
새로 알아간것은 자기자신에 출발해서 자기자신으로 돌아가는 부분은 거리가 주어질때 음수만 아니면 다른 부분에 영향을 안미친다.
"".join()의 경우 매개변수로 iterable한 객체가 들어가야 되고 ""안에는 구분자를 넣어준다 _를 넣으면 중간에 원소 중간중간에 _를 넣어 반환
"""

Expand Down
43 changes: 43 additions & 0 deletions 깊이or너비 우선 탐색/숨바꼭질2.py
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)
41 changes: 41 additions & 0 deletions 깊이or너비 우선 탐색/숨바꼭질3.py
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])





31 changes: 31 additions & 0 deletions 동적계획법/내려가기.py
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))
23 changes: 22 additions & 1 deletion 동적계획법/정수_삼각형.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
# https://school.programmers.co.kr/learn/courses/30/lessons/43105
# https://www.acmicpc.net/problem/1932 <- 백준
# https://school.programmers.co.kr/learn/courses/30/lessons/43105 <- 프로그래머스

"""
프로그래머스 문제 풀이
def solution(triangle):
Expand All @@ -15,3 +19,20 @@ def solution(triangle):
answer = max(triangle[len(triangle)-1])
return answer
"""

# 백준 문제 풀이

n = int(input())

grpah = [list(map(int,input().split())) for _ in range(n)]
dp = [([0]*i) for i in range(1,n+1)]
dp[0][0] = grpah[0][0]

for i in range(0,n-1):
for j in range(len(grpah[i])):
dp[i+1][j] = max(dp[i+1][j], dp[i][j] + grpah[i+1][j])
dp[i+1][j+1] = max(dp[i+1][j+1], dp[i][j] + grpah[i+1][j+1])

print(max(dp[n-1]))
32 changes: 32 additions & 0 deletions 미분류/구간_합_구하기5.py
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])
83 changes: 83 additions & 0 deletions 미분류/이진_검색_트리.py
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])
36 changes: 36 additions & 0 deletions 미분류/치킨_배달.py
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)
45 changes: 45 additions & 0 deletions 미분류/트리_순회.py
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')

0 comments on commit f5b5afe

Please sign in to comment.