๋ฐ์ํ
์ง์ ์ ๋ํ ์ ์ ์ข์ฐ ํ๋ณ
Q. ์ธ ์ ์ด ์์ ๋, ๋ ์ ์ ์ฐ๊ฒฐํ ๋ฐ์ง์ ์ ๊ธฐ์ค์ผ๋ก ์ข์ฐ๋ฅผ ํ๋ณํ ์ ์๋๊ฐ?
→ ๋ฒกํฐ์ ์ธ์ ์ ์ด์ฉํ ์ง์ ์ ๋ํ ์ ์ ์ข์ฐ ํ๋ณ ๊ฐ๋ฅ
def LP(A,B,C):
result1 = (A[0]*B[1]) + (B[0]*C[1]) + (C[0]*A[1])
result2 = (B[0]*A[1]) + (C[0]*B[1]) + (A[0]*C[1])
result = result1 - result2
if (result > 0):
return 'LEFT'
elif (result < 0):
return 'RIGHT'
else:
return 'S'
๋ณผ๋ก ๊ป์ง ๋ฌธ์ ์ ๋ํ ํด๋ฒ
๊ทธ๋ ์ด์ ์ค์บ - ๋ณผ๋ก ๋ค๊ฐํ, ์ค๋ชฉ ๋ค๊ฐํ ๊ตฌ๋ถ
- ์ฃผ์ด์ง ๋ชจ๋ ์ ๋ค ์ค, ๊ฐ์ฅ ์ผ์ชฝ์ ์ ์ ๊ธฐ์ค์ ์ผ๋ก ์ค์ (x์ขํ๊ฐ ๊ฐ์ ๊ฒฝ์ฐ, ๊ฐ์ฅ ์๋์ชฝ ์ ์ ๊ธฐ์ค์ ์ผ๋ก ์ค์ )
- ๊ธฐ์ค์ ์์ ์๊ณ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ๋๋ฉฐ ์ํ ์์๋ฅผ ๊ฒฐ์ (๊ฐ๋๊ฐ ๊ฐ์ ๊ฒฝ์ฐ ๊ธฐ์ค์ ์ ๋ ๊ฐ๊น์ด ์ ์ ๋จผ์ ๋ฐฉ๋ฌธ
Q. ๊ฐ์ฅ ์ผ์ชฝ์ ์๋ ์ ์ ๊ธฐ์ค์ ์ผ๋ก ํ๋ ์ด์ ๋?
- ์์์ ์ ๋ช ํ์ฑ
- ์ ๋ ฌ ๋ฐ ๋น๊ต์ ์ฉ์ด์ฑ
- ๊ณ์ฐ ๋จ์ํ
- ์ผ๊ด๋ ์์์ ๋ณด์ฅ
์์
- ์คํ์ ๊ธฐ์ค์ ๊ณผ 1๋ฒ ์ ์ pushํ๋ ๊ฒ์ผ๋ก ์์
- ์ฌ์ ์ ๋ถ์ฌํ ์์๋๋ก ์ ์ ์คํ์ push
- ๋จ, ์ ์ด ๋ฐ์ง์ ์ค๋ฅธ์ชฝ์ ์กด์ฌํ ๊ฒฝ์ฐ, pop ํ ์ฌ์๋
- ๋ง์ง๋ง ์ ๊น์ง push๋ฅผ ์๋ฃ → ์คํ์ ๋ณผ๋ก ๊ป์ง์ ๋ณด์ฅํจ
def LR(A,B,C):
result1 = (A[0]*B[1]) + (B[0]*C[1]) + (C[0]*A[1])
result2 = (B[0]*A[1]) + (C[0]*B[1]) + (A[0]*C[1])
result = result1 - result2
if (result > 0):
return 'LEFT'
elif (result < 0):
return 'RIGHT'
else:
return 'S'
def slope(A,B):
if (A[0] == B[0]):
return float('inf')
else:
return (B[1]-A[1])/(B[0]-A[0])
def dist(A,B):
return ((B[0]-A[0])**2 + (B[1]-A[1])**2)**(1/2)
p = [[1, 3], [0, 7], [0, 3], [-9, 3], [-3, -8], [2, 4], [8, 8], [7, 7]]
i = p.index(min(p))
p[0], p[i] = p[i], p[0]
for round in range(len(p)):
for i in range(1, len(p)-1):
if slope(p[0], p[i]) > slope(p[0], p[i+1]):
p[i], p[i+1] = p[i+1], p[i]
elif slope(p[0], p[i]) == slope(p[0], p[i+1]):
if dist(p[0], p[i]) > dist(p[0], p[i+1]):
p[i], p[i+1] = p[i+1], p[i]
stack = [p[0], p[1]]
for i in range(2, len(p)):
while(1):
if (LR(stack[-2], stack[-1], p[i]) == 'RIGHT'):
stack.pop()
else:
stack.append(p[i])
break
print(stack)
๋ค๊ฐํ์ ๋ด,์ธ๋ถ ๊ตฌ๋ถ ๋ฌธ์
Q. ์์์ ์ ์์ ํ์ชฝ ๋ฐฉํฅ์ผ๋ก ๊ทธ์์ ๋, ๋ค๊ฐํ๊ณผ ๋ง๋๋ ํ์๊ฐ ์ง์์ด๋, ํ์์ด๋์ ๋ฐ๋ผ, ๋ค๊ฐํ์ ๋ด-์ธ๋ถ๋ฅผ ๊ฒฐ์ ํ ์ ์๋๊ฐ?
→ ๊ผญ์ง์ ์ ์ง๋๋, ์๋๋๋ ๊ด๋ จ ์์. (์์ ๋ณด๊ธฐ ์ ์๋, ์๋๋ผ๊ณ ์๊ฐํจ)
๋ฐ๋ผ์, ‘์์ชฝ ์ ๋ถ๊ณผ ์๋ซ์ชฝ ์ ๋ถ ์ค ํ๋๋ง์ ์ผ๋ค!’
→ ์ ๋ถ๊ณผ ๋ฐ์ง์ ์ด ๊ฒน์น๋ ๊ฒฝ์ฐ๋ ๋ฌด์
def LR(A,B,C):
result1 = (A[0]*B[1]) + (B[0]*C[1]) + (C[0]*A[1])
result2 = (B[0]*A[1]) + (C[0]*B[1]) + (A[0]*C[1])
result = result1 - result2
if (result > 0):
return 'LEFT'
elif (result < 0):
return 'RIGHT'
else:
return 'S'
def Cross(A,B,C,D):
if (LR(A,B,C) != LR(A,B,D) and LR(C,D,A) != LR(C,D,B)):
return True
else:
return False
p = [[-4, 4], [-7, 2], [-3, 1], [-5, -2], [-2, -1], [1, -4], [1, 1], [2, 2]]
x = -6
y = 2
p.append(p[0])
count = 0
for i in range(0, len(p) - 1) :
if (p[i][1] == p[i + 1][1]) :
continue
elif ((p[i][1] == y) and (x < p[i][0])) :
if (p[i + 1][1] > p[i][1]) :
count = count + 1
elif ((p[i + 1][1] == y) and (x < p[i + 1][0])) :
if (p[i][1] > p[i + 1][1]) :
count = count + 1
else :
if Cross(p[i], p[i + 1], [x, y], [100000000, y]) == True :
count = count + 1
if (count % 2 == 0) :
print("OUT")
else :
print("IN")
๋ฐ์ํ