Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions 12주차/Main_22255_호석사우루스.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import sys
from heapq import heappop, heappush
input = sys.stdin.readline


def dijkstra():
visit = [[[1e9 for _ in range(m)] for _ in range(n)] for _ in range(3)]
visit[1][sy-1][sx-1] = 0
heap = [[0, 1, sy-1, sx-1]]
while heap:
weight, num, y, x = heappop(heap)
if weight > visit[num][y][x]:
continue
if num == 0:
for i in range(4):
yy = y + d[i]
xx = x + d[i-1]
if 0 <= yy < n and 0 <= xx < m and arr[yy][xx] != -1 and visit[1][yy][xx] > weight + arr[yy][xx]:
visit[1][yy][xx] = weight + arr[yy][xx]
heappush(heap, [visit[1][yy][xx], 1, yy, xx])
elif num == 1:
for i in range(2):
yy = y + d[i*2+1]
xx = x
if 0 <= yy < n and 0 <= xx < m and arr[yy][xx] != -1 and visit[2][yy][xx] > weight + arr[yy][xx]:
visit[2][yy][xx] = weight + arr[yy][xx]
heappush(heap, [visit[2][yy][xx], 2, yy, xx])
else:
for i in range(2):
yy = y
xx = x + d[i*2+1]
if 0 <= yy < n and 0 <= xx < m and arr[yy][xx] != -1 and visit[0][yy][xx] > weight + arr[yy][xx]:
visit[0][yy][xx] = weight + arr[yy][xx]
heappush(heap, [visit[0][yy][xx], 0, yy, xx])
return min(visit[0][ey-1][ex-1], min(visit[1][ey-1][ex-1], visit[2][ey-1][ex-1]))

n, m = map(int, input().split())
sy, sx, ey, ex = map(int, input().split())
arr = [[*map(int, input().split())] for _ in range(n)]
d = [0, 1, 0, -1]
answer = dijkstra()
print(answer if answer != 1e9 else -1)
41 changes: 41 additions & 0 deletions 12주차/Programmers_미로탈출명령어.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
from collections import deque
import sys

sys.setrecursionlimit(3000)


def solution(n, m, x, y, r, c, k):
def dfs(y, x, v):
if abs(r - y - 1) + abs(c - x - 1) > k - v:
return False
if y == r - 1 and x == c - 1 and v == k:
return True
if y + 1 < n:
string[y + 1][x][v + 1] = string[y][x][v] + "d"
if dfs(y + 1, x, v + 1):
return True
if x - 1 >= 0:
string[y][x - 1][v + 1] = string[y][x][v] + "l"
if dfs(y, x - 1, v + 1):
return True
if x + 1 < m:
string[y][x + 1][v + 1] = string[y][x][v] + "r"
if dfs(y, x + 1, v + 1):
return True
if y - 1 >= 0:
string[y - 1][x][v + 1] = string[y][x][v] + "u"
if dfs(y - 1, x, v + 1):
return True

answer = ''
dy = [1, 0, 0, -1]
dx = [0, -1, 1, 0]
check = k - abs(r - x) - abs(c - y)
if check < 0 or check % 2:
return "impossible"
queue = deque([[x - 1, y - 1, 0]])
string = [[["" for _ in range(k + 1)] for _ in range(m)] for _ in range(n)]
dfs(x - 1, y - 1, 0)

answer = string[r - 1][c - 1][k]
return answer
35 changes: 35 additions & 0 deletions 12주차/Programmers_양궁대회.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
def bf(info, ret, index, arrow, lion, apeach):
global diff
global answer
r = ret[:]
if index == 10 or arrow == 0:
r[10] += arrow
d = lion - apeach
if diff < d:
diff = d
answer = r
if diff != 0 and diff == d:
for i in range(10,-1,-1):
if answer[i] > r[i]:
break
elif answer[i] < r[i]:
answer = r
break
return
if arrow >= info[index]+1:
r[index] += info[index]+1
bf(info, r, index+1, arrow-info[index]-1, lion+10-index, [apeach,apeach+index-10][info[index] != 0])
bf(info, ret, index+1, arrow, lion, apeach)
diff = 0
answer = [0]*11

def solution(n, info):
global answer
apeach = 0
for i, v in enumerate(info):
if v:
apeach += 10-i
bf(info, [0]*11, 0, n, 0, apeach)
if not sum(answer):
answer = [-1]
return answer
38 changes: 38 additions & 0 deletions 12주차/Programmers_이모티콘할인행사.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# 1. 가입자 증가
# 2. 판매액 증가

# 할인 비율이 일정 기준 이상 시 구매
# 구매 비용 합이 일정 기준 이상 시 플러스
answer = [0, 0]
maxRegist = 0


def solution(users, emoticons):
def bf(idx, buy):
global answer, maxRegist
if idx == len(emoticons):
# print(buy)
regist = 0
money = 0
for i, v in enumerate(users):
if v[1] <= buy[i]:
regist += 1
else:
money += buy[i]
if regist > maxRegist:
answer = [regist, money]
maxRegist = regist
elif regist == maxRegist:
answer[1] = max(answer[1], money)
return
price = emoticons[idx]
for per in range(10, 50, 10):
temp = buy[:]
for i, v in enumerate(users):
if v[0] <= per:
temp[i] += price * (100 - per) // 100
bf(idx + 1, temp)

bf(0, [0] * len(users))

return answer
41 changes: 41 additions & 0 deletions 12주차/Programmers_표현가능한이진트리.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
flag = True
leaf = 0
def solution(numbers):
global flag, leaf
answer = []
for x in numbers:
x = bin(x)[2:]
j = 2
k = 0
while j-1 < len(x):
j = j * 2
k = k + 1
for _ in range(len(x), j-1):
x = '0' + x
flag = True
leaf = 0
if x[len(x)//2] == '0':
answer.append(0)
continue
if len(x) == 1:
answer.append(1)
continue
back(x, len(x)//2, 2**(k-1), True)
answer.append(int(flag))
return answer

def back(chr, num, dep, key):
global flag, leaf
if dep == 0:
if chr[num] == '0':
leaf += 1
elif not key:
flag = False
return
if chr[num] == '1' and not key:
flag = False
return
if chr[num] == '0':
key = False
back(chr, num - dep, dep//2, key)
back(chr, num + dep, dep//2, key)