[BOJ][๐ก5][๋ฐฑ์ค#22238] ๊ฐํฌ์ btd5
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold V
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
btd5์๋ Darting Gun Tower๊ฐ ์์ต๋๋ค. Darting Gun Tower๋ ์๋์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ์ ์ ๊ณต๊ฒฉํฉ๋๋ค.
๊ณต๊ฒฉํ๊ณ ์ ํ๋ ๋ชฉํ๋ฌผ์ ๋ฐฉํฅ์ผ๋ก ๊ณต๊ฒฉ ๋ฐฉํฅ์ ๋ฐ๊ฟ๋๋ค. ๊ณต๊ฒฉ ๋ฐฉํฅ์ ์๋ ํ์ ๋ค์ ์ฒด๋ ฅ์ d์ฉ ๋ฎ์ถฅ๋๋ค.
Darting Gun Tower๋ย ์ขํ (0, 0)์ ํ๋ ์์ต๋๋ค. Darting Gun Tower๊ฐ ๊ณต๊ฒฉ์ ํ๊ฒ ๋๋ฉด, ๊ณต๊ฒฉํ๋ ๋ฐฉํฅ์ ๋์ธ ๋ชจ๋ ํ์ ๋ค์ย ๋์ผํ ์์น์ ํผํด๋ฅผ ์ ํ๊ฒ ๋ฉ๋๋ค. ์ด๊ธฐ์ ํ์ ์ N๊ฐ ์๊ณ , Darting Gun Tower๋ ๊ณต๊ฒฉ์ M๋ฒ ํ์์ต๋๋ค. ๊ณต๊ฒฉ์ ๋๋ผ ๋ ๋ง๋ค, ๋จ์ ํ์ ์ ์๋ฅผ ์ธ์ด ์ฃผ์ธ์. ์ด๊ธฐ ์ํ์ Darting Gun Tower๊ฐ ํน์ ๋ฐฉํฅ์ผ๋ก ๋ฐ๋ฏธ์ง๊ฐ 109ย ์ด์์ ๊ณต๊ฒฉ์ ํ์ ๋, ๋ชจ๋ ํ์ ์ ์ ๊ฑฐํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์กด์ฌํฉ๋๋ค.
์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์ N, M์ด ์ฃผ์ด์ง๋๋ค. 2๋ฒ์งธ ์ค๋ถํฐ N+1๋ฒ์งธ ์ค๊น์ง ํ์ ์ด ์๋ x์ขํ, y์ขํ, ์ฒด๋ ฅ์ด ์ฃผ์ด์ง๋๋ค. N+2๋ฒ์งธ ์ค๋ถํฐ N+M+1๋ฒ์งธ ์ค๊น์ง Darting Gun Tower์ ๊ณต๊ฒฉ ๋ฐฉํฅ (x, y)์, Darting Gun Tower๊ฐ ์ค ๋ฐ๋ฏธ์ง d๊ฐ ์ฃผ์ด์ง๋๋ค.
์ถ๋ ฅ
x๋ฒ์งธ ์ค์ x๋ฒ์งธ ๊ณต๊ฒฉ์ด ๋๋ฌ์ ๋ ๋จ์ ํ์ ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํด ์ฃผ์ธ์.
์ ํ
N๊ณผ M์ ๊ตฌ๊ฐ [1, 2ร105]์ ์ํ๋ ์ ์์ ๋๋ค. ํ์ ๋ค์ x ์ขํ์ y ์ขํ๋ [-109, 109]์ ์ํ๋ ์ ์์ ๋๋ค. ํ์ ๋ค์ ์์น๋ ๊ณ ์ ๋์ด ์์ผ๋ฉฐ, ํ์ ์ด ์๋ ์์น์ Darting Gun Tower๊ฐ ์์ง ์์ต๋๋ค. ๋ ๊ฐ ์ด์์ ํ์ ์ด ๊ฐ์ ์์น์ ์์ง ์์ต๋๋ค. ํ์ ๋ค์ hp์ Darting Gun Tower๊ฐ ์ฃผ๋ ๋ฐ๋ฏธ์ง๋ ๊ตฌ๊ฐ [1, 109]์ ์ํ๋ ์ ์์ ๋๋ค.
์์
์ ๋ ฅ
3 1
1 1 3
3 3 4
2 2 2
1 1 3
์ถ๋ ฅ
1
My Sol
import sys
input = sys.stdin.readline
from heapq import heappop, heappush
from math import gcd
def find_s(x, y):
g = gcd(x, y)
return (x/g, y/g)
N, M = map(int, input().split())
D = {}
for _ in range(N):
x, y, d = map(int, input().split())
s = find_s(x, y)
if not D.get(s, ''):
D[s] = [0, []]
heappush(D[s][1], d)
for _ in range(M):
x, y, d = map(int, input().split())
s = find_s(x, y)
if not D.get(s, ''):
print(N)
continue
D[s][0] += d
while D[s][1]:
if D[s][1][0] > D[s][0]: break
heappop(D[s][1])
N -= 1
print(N)
๊ฝค๋ ๊น๋ค๋ก์ด ๋ฌธ์ ์๋ค. heap์ ์ฌ์ฉํด์ ์กฐ๊ธ ์ด๋ ต๊ฒ ํ์๋ ๊ฒ๋ ๊ฐ์ง๋ง ํ ๋์๋ ์ต์ ์ด์๋คโฆ
- ๋์ ๋๋ฆฌ D๋ ํน์ slope์์์ ๋์ ๋ฐ๋ฏธ์ง์ ํด๋น slope์ ์ํฅ๊ถ์ ์๋ ํ์ ๋ค์ ์ฒด๋ ฅ๋ค์ ์ ์ฅํ๋ค.
- M๋ฒ์ ๊ณต๊ฒฉ ์ ๋ ฅ๋์ ๋ฐ๋ฏธ์ง๋ฅผ ํด๋น slope์ ๋์ ๋ฐ๋ฏธ์ง์ ๋ํ๊ณ ์ด๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ฒด๋ ฅ์ ํ์ ๋ค์ ์ ๊ฑฐํ๋ฉฐ N์ ์ค์ธ๋ค.
- slope๋ y/x๋ก ๊ตฌํ๋ ค ํ์ผ๋ ๊ทน๋จ์ ์ธ ์ผ์ด์ค์์ ๋งค์ฐ ์์ ์์์ ํฌ๊ธฐ ์ฐจ์ด๋ ๊ตฌ๋ถ์ด ๋์ง ์์ผ๋ฏ๋ก ์ต๋๊ณต์ฝ์ gcd๋ฅผ ํ์ฉํด ๊ตฌ๋ถํ๋ค.
์ต์ด์, ๊ฐ์ ๋ผ์ธ์ ์๋ ๊ตฌ๋ถ์ y/x
์ ๊ธฐ์ธ๊ธฐ ๊ณ์ฐ์ ํตํด์ ํ๋๋ฐ, ์ ์ ์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ํ์ง๋ง ๊ทน๋จ์ ์ธ ์ฌ๊ณ๋ฅผ ํ์ฉํด ๋ฌธ์ ๋ฅผ ํ์
ํ ์ ์์๋ค.
1 2
999999998 1000000000 10
999999998 999999999 20
999999997 999999998 30
์ด ๊ฒฝ์ฐ 1.0000โฆ1, 2 ์์ค์ผ๋ก ๋งค์ฐ ์์ ํฌ๊ธฐ์ ์ฐจ์ด๊ฐ ๋ฐ์ํ๊ณ , ์ด๋ ํ๋ก๊ทธ๋๋ฐ์ ์์ ์ฒ๋ฆฌ ํน์ฑ์ ๊ฐ์ ์๋ก ์ฒ๋ฆฌ๋๋ค. ํ์ง๋ง ๊ทธ๋ฌ๋ฉด ์ ๋๋ฏ๋ก ์ต๋๊ณต์ฝ์๋ฅผ ํ์ฉํ ๊ตฌ๋ถ์ ํด์ฃผ์๋ค.
๋ํ gcd ๋์ ์ ์ ๋ฐฉํฅ์ ํ์ธํ๊ธฐ ์ํด 12์ ๋ฐฉํฅ๋ถํฐ ์๊ณ๋ฐฉํฅ์ผ๋ก 1๋ถํฐ 8๊น์ง์ ๊ตฌ๋ถ์ ๋์ด returnํ๋ค.
def find_s(x, y):
g = gcd(x, y)
if not x: return (0, 0, 1) if y > 0 else (0, 0, 5)
if not y: return (0, 0, 3) if x > 0 else (0, 0, 7)
if x > 0: d = 2 if y > 0 else 4
else: d = 8 if y > 0 else 6
return (x/g, y/g, d)
ํ์ง๋ง ์ต๋๊ณต์ฝ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐฉํฅ์ ํ์ ์ด ๋ถํ์ํ๋ฏ๋ก ์๋๊ณผ ๊ฐ์ด ์งง๊ฒ ํํ๋ ์ ์๋ค.
def find_s(x, y):
g = gcd(x, y)
return (x/g, y/g)
๊ทธ๋ฐ๋ฐ ์์ธ๋ก ์์ ํจ์๊ฐ ์ฐ์ฐ์๊ฐ์ด ๋ ์งง์๋ค. ๋ถ๊ธฐ์ฒ๋ฆฌ๊ฐ ๋ง์์ ๋น์ฐํ ๋ ์ค๋ ๊ฑธ๋ฆด ์ค ์์๋๋ฐ, gcd ํจ์๋ฅผ ๋ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด ์๋๊น ์ถ์ธกํด๋ณธ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋๊ธ๋จ๊ธฐ๊ธฐ