νμ€ν μΉπ κ°λ°μ μ§λ§μ π§π½βπ»
β μΈκ³΅μ§λ₯ κ΄μ¬ π€
Categories
-
β£
βΆ COMPUTER_SCIENCE
π: 7 -
β£
βΆ WEB
π: 3 -
β£
βΆ ETC
π: 3-
β
β£
ETCS
π: 10 -
β
β£
SUBBRAIN κ°λ°κΈ°
π: 5 -
β
β
YOS κ°λ°κΈ°
π: 1
-
β
β£
-
β
βΆ AI
π: 9-
β£
AITOOLS
π: 3 -
β£
CV
π: 2 -
β£
DEEP_LEARNING
π: 1 -
β£
DATA_VIS
π: 2 -
β£
GRAPH
π: 1 -
β£
LIGHTWEIGHT
π: 1 -
β£
MATH
π: 1 -
β£
NLP
π: 3 -
β
STRUCTURED_DATA
π: 2
-
β£
Python for Algorithms-etc
Python for Algorithms-etc
μ€μν
곡κ°μ νμͺ½ λλΆν° λλ¨Έμ§ λκΉμ§ νμΌλ©΄μ λ§μ£ΌμΉλ λΆλΆμ μ²λ¦¬νλ λ°©μ
μ λ ¬, κΈ°μ€μ‘κΈ°, μν λ³νλ₯Ό μ μ₯νλ κ²μ΄ μ€μνλ€.
μ»¨λ²‘μ€ ν
CCW(Counter Clock Wise)
벑ν°μ μΈμ (Cross Product)λ₯Ό μ΄μ©ν΄ μ μ μμ κΈ°μ€μΌλ‘ λ€λ₯Έ μ μ μλμ μμΉλ₯Ό μμλ
def ccw(fr_point, to_point, target_point):
fr_x, fr_y = fr_point
to_x, to_y = to_point
tg_x, tg_y = target_point
result = (to_x - fr_x)*(tg_y - fr_y) - (tg_x - fr_x)*(to_y - fr_y)
if result > 0:
return 1 # λ°μκ³ λ°©ν₯
elif result < 0:
return -1 # μκ³ λ°©ν₯
else:
return 0 # νν
κ·ΈλΌν¨ μ€μΊ
def ccw(a, b, c):
t = (b['x']-a['x'])*(c['y']-a['y']) - (c['x'] - a['x'])*(b['y'] - a['y'])
if t > 0:
return 1
elif t < 0:
return -1
else :
return 0
def comp_by_ccw(a, b):
global firstPoint
return -ccw(firstPoint,a,b)
def comp_by_pos(a, b):
if a['y'] == b['y']:
return 1 if a['x'] > b['x'] else -1
else:
return 1 if a['y'] > b['y'] else -1
firstPoint = {'x':0, 'y':9999099} # μ λ ¬μ μν κΈ°μ€
points.sort(key=functools.cmp_to_key(comp_by_pos)) # 맨 μΌμͺ½ μ μ§μ λΆν° μ μν μ λ ¬
points.sort(key=functools.cmp_to_key(comp_by_ccw)) # κΈ°μ€μμ μΈλΆ κ»μ§ μ°μ μΌλ‘ μ λ ¬
st = [points[0], points[1]] # 첫 λ μμ μ§μ μ
λ ₯
for point in points[2:]: # λͺ¨λ μ§μ μμ
while(len(st) >=2):
if (ccw(st[-2], st[-1], point) > 0): # λ€μ μ μ΄ λ μΈλΆ κ»μ§ λΆλΆμ μλμ§ νμΈ
break # while λ¬Έμ΄λ―λ‘ μ€ν λ΄μ λͺ¨λ μ μ λν΄μ κ²μ¬ν¨
st.pop() # λ§μ½ λ μΈλΆ κ»μ§μ΄λ©΄ 2λ²μ§Έ κΈ°μ€μ μ λ΄λ³΄λ
st.append(point) # μλ‘μ΄ κΈ°μ€μ μ§μ΄ λ£μ
print(len(st))
λμ ν©
κ°±μ μ΄ μλ κ²½μ°μ μ ν©νλ©°, κ°±μ μ΄ μ¦μ κ²½μ° λμ ν©μ κ³μ λ€μ ꡬν΄μΌνλ―λ‘ μ°¨λΌλ¦¬ μΈκ·Έλ¨ΌνΈ νΈλ¦¬λ₯Ό μ΄μ©νμ.
λμ ν©
미리 $(0\sim n)$ μμ λ°°μ΄($n$)μ ν΅ν΄ λμ ν© λ°°μ΄($p$)μ μ μ₯ν΄λλλ€.
μ΄λ $p[i] = p[i-1] + n[i]$ μ΄λ©°, μ¦, $p[i]$λ $(0,i)$κΉμ§μ ν©μ΄λ€.
μ΄λ₯Ό $O(n)$μ μκ°μμ λ§λ€ μ μλ€.
μ΄ν μνλ κ΅¬κ° $(i, j)$μ ꡬκ°ν©λ§ ꡬνκ³ μΆλ€λ©΄ $p[j]-p[i]$λ‘ $O(1)$μΌλ‘ λΉ λ₯΄κ² ꡬν μ μλ€.
2μ°¨μ λμ ν©
ν λ°©ν₯μ λμ ν©μ λ¨Όμ κ° νλ§λ€ ꡬν λ€, κΈ°λ‘ ν,
μ΄ λ°©ν₯μ λμ ν©μ ꡬνλ©΄ 2μ°¨μ λμ ν©μ $O(n^2)$μ μλλ‘ κ΅¬ν μ μλ€.
2μ°¨μ κ΅¬κ° ν©μ $(x_1, y_1) \sim (x_2, y_2)$μ ν©μ ꡬνκ³ μΆλ€λ©΄
\(p(x_2,y_2)-p(x_1, y_2)-p(x_2, y_1) + p(x_1, y_1)\)
μΌλ‘ $O(1)$μΌλ‘ λΉ λ₯΄κ² ꡬν μ μλ€.
imos
imosλ λμ ν©μ νμ₯μΌλ‘, κ°±μ μμκ³Ό λ ꡬκ°λ§μ κΈ°λ‘νμ¬ κ°±μ μ΄ μ¦μ κ΅¬κ° κ°μ λΉ λ₯΄κ² κ°±μ ν μ μλ€.
λ°°μ΄μ ν¬κΈ°λ₯Ό $N$, κ΅¬κ° ν©μ κ°―μλ₯Ό $M$μ΄λΌκ³ ν λ, κΈ°μ‘΄μ μκ° λ³΅μ‘λ $O(M\times N)$μμ $O(M+N)$μΌλ‘ λ°κΏ μ μλ€.
def solution(board, sums):
# λμ ν©μ λ§μ§λ§ μΈλ±μ€ + 1μ λ³νκ°μ νλ±μμ λνκΈ° λλ¬Έμ
# κΈ°μ‘΄ λ°°μ΄λ³΄λ€ ν¬κΈ°κ° 1μ»€μΌ νλ€.
new_board = board + [0]
for props in sums:
# x1 ~ x2κΉμ§ degree κ°λ§νΌ λ³νμν¨λ€.
x1, x2, degree = props
# λμ ν©μ 첫 μΈλ±μ€μ λ§μ§λ§ μΈλ±μ€ + 1 λΆλΆμ κ°κ° λ³νλμΌν κ°κ³Ό κ·Έ κ°μ νλ±μμ λν΄μΌ νλ€.
# μλ₯Ό λ€μ΄ μΈλ±μ€ 0 ~ 2κΉμ§ κ°μ X λ§νΌ λ³νμν¨λ€λ©΄ λ€μκ³Ό κ°μ΄ μ€μ νλ€.
# 0 1 2 3
# [+X, 0, 0, -X]
new_board[x1] += degree
new_board[x2] -= degree
# μ΄ν κ° μμμ μ μ©λ λμ ν©μ ꡬνλ€. μ΄μ μΈλ±μ€ κ°μ μμ°¨μ μΌλ‘ λν΄μ£Όλ©΄ λλ€.
for i in range(1, len(new_board)):
new_board[i] += new_board[i-1]
# ν΄λΉ λμ ν©μ μλ λ°°μ΄μ μ μ©μν€κΈ°
for i in range(len(board)):
board[i] += new_board[i]
return board
2μ°¨μ imos
def solution(board, sums):
# λμ ν©μ λ§μ§λ§ μΈλ±μ€ + 1μ λ³νκ°μ νλ±μμ λνκΈ° λλ¬Έμ
# κΈ°μ‘΄ λ°°μ΄λ³΄λ€ κ°λ‘ μΈλ‘ ν¬κΈ°κ° 1μ»€μΌ νλ€.
new_board = [[0]*(len(board[0])+1) for _ in board] + [[0]*(len(board[0])+1)]
for props in sums:
# (x1, y1) ~ (x2, y2)κΉμ§ degree κ°λ§νΌ λ³νμν¨λ€.
x1, y1, x2, y2, degree = props
# 2μ°¨μ λμ ν©μ 1μ°¨μκ³Ό λ¬λ¦¬ λ λ°©ν₯μΌλ‘ μΈλ±μ€λ₯Ό λμ ν©μ μ€μ ν΄μΌ νλ€.
# μλ₯Ό λ€μ΄ (0,0) ~ (2,2)κΉμ§ κ°μ X λ§νΌ λ³νμν¨λ€λ©΄ λ€μκ³Ό κ°μ΄ μ€μ νλ€.
# / 0 1 2 3
# 0 (+X, 0, 0, -X)
# 1 ( 0, 0, 0, 0)
# 2 ( 0, 0, 0, 0)
# 3 (-X, 0, 0, +X)
# μ°Έκ³ λ‘, (0,0) ~ (0, 2)μ²λΌ νμ€μ λμ ν© λν
# μμΈ μμ΄ λ€μκ³Ό κ°μ΄ λ€μ μ€μ μΈλ±μ€λ₯Ό μ€μ ν΄μΌ νλ€.
# / 0 1 2 3
# 0 (+X, 0, 0, -X)
# 1 (-X, 0, 0, +X)
# 2 ( 0, 0, 0, 0)
# 3 ( 0, 0, 0, 0)
for i, j in [[x1, y1], [x2+1, y2+1]]:
new_board[i][j] += degree
for i, j in [[x2+1, y1], [x1, y2+1]]:
new_board[i][j] -= degree
# μ΄ν κ° κ°λ‘ μ€ λ¨Όμ κ°λ‘ λ°©ν₯ λμ ν©μ ꡬνκ³
for i in range(len(new_board)):
for j in range(1,len(new_board[0])): # μ΄λ, κ°λ‘μ€μ μΈλ±μ€κ° 1λΆν° μμν΄μΌνλ€.
new_board[i][j] += new_board[i][j-1]
# μ΄ν κ° μΈλ‘ μ€μ μΈλ‘ λ°©ν₯ λμ ν©μ λνλ©΄ λλ€.
for i in range(1,len(new_board)):
for j in range(len(new_board[0])): # μ΄λ, μΈλ‘μ€μ μΈλ±μ€κ° 1λΆν° μμν΄μΌνλ€.
new_board[i][j] += new_board[i-1][j]
# ν΄λΉ λμ ν©μ μλ 2μ°¨μ λ°°μ΄μ μ μ©μν€κΈ°
for i in range(len(board)):
for j in range(len(board[0])):
board[i][j] += new_board[i][j]
return board
_articles/computer_science/algorithm/Python for Algorithms-etc.md