๋ฐฑ์ค€ BOJ 32205 ๋„ค๋ชจ์˜ ๊ฟˆ

https://www.acmicpc.net/problem/32205

ํŒŒ์ด์ฌ python ๋ฌธ์ œ ํ’€์ด



๋ฌธ์ œ

๊ท€์—ฌ์šด ์„ธ๋ชจ ๋“ฑ์žฅ ><

์„ธ๋ชจ๋Š” ๋„ค๋ชจ๊ฐ€ ๋˜๊ณ  ์‹ถ์–ด์š”. ์„ธ๋ชจย N๊ฐœ์˜ ๊ฐ ๋ณ€์˜ ๊ธธ์ด๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ ์›ํ•˜๋Š” ์„ธ๋ชจ ๋‘ ๊ฐœ๋ฅผ ๊ณจ๋ผ ๊ฐ™์€ ๊ธธ์ด์˜ ๋ณ€์ด ๋งž๋‹ฟ๊ฒŒ ๋ถ™์—ฌ์„œ ๋„ค๋ชจ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”!

๋„ค๋ชจ๋ž€, ๊ผญ์ง“์ ์ด ๋„ค ๊ฐœ์ด๋ฉด์„œ ์–ด๋–ค ๋‚ด๊ฐ๋„ 180๋„๊ฐ€ ์•„๋‹Œ ๋‹จ์ˆœ ๋‹ค๊ฐํ˜•์ด์—์š”.



์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์„ธ๋ชจ์˜ ๊ฐœ์ˆ˜ย N์ด ์ฃผ์–ด์ง„๋‹ค. โ€Š

๋‘˜์งธ ์ค„๋ถ€ํ„ฐย N๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ๊ฐ ์ค„์— ์„ธ๋ชจ์˜ ์„ธ ๋ณ€์˜ ๊ธธ์ด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ย a,ย b,ย c๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง„๋‹ค. ๋ณ€์˜ ๊ธธ์ด๊ฐ€ย a,ย b,ย c์ธ ์‚ผ๊ฐํ˜•์€ ์กด์žฌํ•œ๋‹ค.ย 



์ถœ๋ ฅ

์›ํ•˜๋Š” ์„ธ๋ชจ ๋‘ ๊ฐœ๋ฅผ ๊ณจ๋ผ ๊ฐ™์€ ๊ธธ์ด์˜ ๋ณ€์ด ๋งž๋‹ฟ๊ฒŒ ๋ถ™์—ฌ์„œ ๋„ค๋ชจ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉดย 1, ์—†์œผ๋ฉดย 0์„ ์ถœ๋ ฅํ•œ๋‹ค.



ํ’€์ด

๋‘ ๊ฐœ์˜ ์‚ผ๊ฐํ˜•์„ ๋งž๋ถ™์—ฌ์„œ ๋„ค๋ชจ(์‚ฌ๊ฐํ˜•)๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฌธ์ œ๋กœ, ๋‘ ์‚ผ๊ฐํ˜•์ด ๊ฐ™์€ ๊ธธ์ด์˜ ๋ณ€์„ ๊ณต์œ ํ•˜๋ฉด์„œ ๋ถ™์œผ๋ฉด ๋„ค๋ชจ๊ฐ€ ๋œ๋‹ค.

edges = {}

์ด ๋”•์…”๋„ˆ๋ฆฌ๋Š” ํŠน์ • ๊ธธ์ด์˜ ๋ณ€์„ ๊ฐ€์ง„ ๋ชจ๋“  ์‚ผ๊ฐํ˜•๋“ค์˜ ์ •๋ณด๋ฅผ ์ €์žฅ

  • ํ‚ค: ๋ณ€์˜ ๊ธธ์ด
  • ๊ฐ’: ๊ทธ ๊ธธ์ด์˜ ๋ณ€์„ ๊ฐ€์ง„ ์‚ผ๊ฐํ˜•๋“ค์˜ ๋‚˜๋จธ์ง€ ๋‘ ๋ณ€์˜ ๊ธธ์ด๋ฅผ ํŠœํ”Œ๋กœ ์ €์žฅ

for a, b, c in tris:
    if a not in edge:
        edge[a] = []
    if b not in edge:
        edge[b] = []
    if c not in edge:
        edge[c] = []
    
    edge[a].append((b, c))
    edge[b].append((a, c))
    edge[c].append((a, b))
  • ๊ฐ ์‚ผ๊ฐํ˜•(a, b, c)์— ๋Œ€ํ•ด
    • a ๊ธธ์ด์˜ ๋ณ€์„ ๊ณต์œ ํ•œ๋‹ค๋ฉด: ๋‚˜๋จธ์ง€ ๋‘ ๋ณ€ (b, c)๋ฅผ edge[a]์— ์ €์žฅ
    • b ๊ธธ์ด์˜ ๋ณ€์„ ๊ณต์œ ํ•œ๋‹ค๋ฉด: ๋‚˜๋จธ์ง€ ๋‘ ๋ณ€ (a, c)๋ฅผ edge[b]์— ์ €์žฅ
    • c ๊ธธ์ด์˜ ๋ณ€์„ ๊ณต์œ ํ•œ๋‹ค๋ฉด: ๋‚˜๋จธ์ง€ ๋‘ ๋ณ€ (a, b)๋ฅผ edge[c]์— ์ €์žฅ

์˜ˆ๋ฅผ ๋“ค์–ด, [3, 4, 5]์™€ [3, 7, 8] ๋‘ ์‚ผ๊ฐํ˜•์ด ์žˆ๋‹ค๋ฉด

  • edge[3]์—๋Š” [(4, 5), (7, 8)]์ด ์ €์žฅ
    • ๊ธธ์ด๊ฐ€ 3์ธ ๋ณ€์„ ๊ฐ€์ง„ ์‚ผ๊ฐํ˜•๋“ค์˜ ๋‚˜๋จธ์ง€ ๋‘ ๋ณ€์˜ ๊ธธ์ด๋“ค์„ ์˜๋ฏธ

for edge_length, triangle_side in edge.items():
    if len(triangle_side) >= 2:  # ๊ฐ™์€ ๊ธธ์ด์˜ ๋ณ€์„ ๊ฐ€์ง„ ์‚ผ๊ฐํ˜•์ด 2๊ฐœ ์ด์ƒ์ธ ๊ฒฝ์šฐ
        for i in range(len(triangle_side)):
            for j in range(i + 1, len(triangle_side)):
                side1, side2 = triangle_side[i]
                side3, side4 = triangle_side[j]
                
                sides = [side1, side2, side3, side4]
                sides.sort()
                
                if sides[3] < sides[0] + sides[1] + sides[2]:
                    return True
  • ๊ฐ ๋ณ€์˜ ๊ธธ์ด๋งˆ๋‹ค, ๊ทธ ๊ธธ์ด๋ฅผ ๊ณต์œ ํ•˜๋Š” ์‚ผ๊ฐํ˜•์ด 2๊ฐœ ์ด์ƒ ์žˆ๋Š”์ง€ ํ™•์ธ
    • ๋งŒ์•ฝ ์žˆ๋‹ค๋ฉด, ๋‘ ์‚ผ๊ฐํ˜•์„ ์„ ํƒํ•ด์„œ ์‚ฌ๊ฐํ˜•์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ํŒ๋‹จ
  • ์‚ฌ๊ฐํ˜•์ด ๋  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด: ๊ฐ€์žฅ ๊ธด ๋ณ€ < ๋‚˜๋จธ์ง€ ์„ธ ๋ณ€์˜ ํ•ฉ
    • ์ด๋Š” ์‚ฌ๊ฐํ˜•์˜ ์„ฑ๋ฆฝ ์กฐ๊ฑด์œผ๋กœ, ์ด ์กฐ๊ฑด์ด ๋งŒ์กฑ๋˜์ง€ ์•Š์œผ๋ฉด ์‚ฌ๊ฐํ˜•์ด ์•„๋‹Œ ์ผ์ž๋กœ ํŽด์ง„ ํ˜•ํƒœ๊ฐ€ ๋œ๋‹ค

์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ผ๊ฐํ˜• [3, 4, 5]์™€ [3, 7, 8]์„ ๊ธธ์ด 3์ธ ๋ณ€์—์„œ ๋ถ™์ธ๋‹ค๋ฉด

  • ์‚ฌ๊ฐํ˜•์˜ ๋„ค ๋ณ€์€ 4, 5, 7, 8์ด ๋จ
  • ๊ฐ€์žฅ ๊ธด ๋ณ€(8) < ๋‚˜๋จธ์ง€ ๋ณ€์˜ ํ•ฉ(4+5+7=16)์ด๋ฏ€๋กœ ์‚ฌ๊ฐํ˜• ํ˜•์„ฑ์ด ๊ฐ€๋Šฅํ•จ

์ „์ฒด ์ฝ”๋“œ

# 32205 ๋„ค๋ชจ์˜ ๊ฟˆ
 
import sys
 
def sq_check(tri):
ย  ย  # ๊ฐ ๋ณ€์˜ ๊ธธ์ด๋ฅผ ํ‚ค๋กœ ํ•˜๋Š” ํ•ด์‹œ๋งต์„ ์ƒ์„ฑ
ย  ย  # ๊ฐ’์€ ํ•ด๋‹น ๋ณ€์„ ๊ฐ€์ง„ ์‚ผ๊ฐํ˜•๋“ค์˜ ๋‹ค๋ฅธ ๋‘ ๋ณ€์˜ ๊ธธ์ด ์Œ์„ ์ €์žฅ
 
ย  ย  edge = {}
ย  ย  for a, b, c in tri:
ย  ย  ย  ย  if a not in edge:
ย  ย  ย  ย  ย  ย  edge[a] = []
ย  ย  ย  ย  if b not in edge:
ย  ย  ย  ย  ย  ย  edge[b] = []
ย  ย  ย  ย  if c not in edge:
ย  ย  ย  ย  ย  ย  edge[c] = []
ย  ย  ย  ย  edge[a].append((b, c))
ย  ย  ย  ย  edge[b].append((a, c))
ย  ย  ย  ย  edge[c].append((a, b))
 
ย  ย  # ๊ฐ ๋ณ€ ๊ธธ์ด์— ๋Œ€ํ•ด ํ™•์ธ
ย  ย  for edge_length, triangle_side in edge.items():
ย  ย  ย  ย  # ๊ฐ™์€ ๊ธธ์ด์˜ ๋ณ€์„ ๊ฐ€์ง„ ์‚ผ๊ฐํ˜•์ด 2๊ฐœ ์ด์ƒ์ธ ๊ฒฝ์šฐ์—๋งŒ ํ™•์ธ
ย  ย  ย  ย  if len(triangle_side) >= 2:
ย  ย  ย  ย  ย  ย  for i in range(len(triangle_side)):
ย  ย  ย  ย  ย  ย  ย  ย  for j in range(i + 1, len(triangle_side)):
ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  side1, side2 = triangle_side[i]
ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  side3, side4 = triangle_side[j]
ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  
ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  # ์‚ผ๊ฐํ˜•์„ ๋ถ™์˜€์„ ๋•Œ ์‚ฌ๊ฐํ˜•์ด ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌ
ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  # ์‚ผ๊ฐํ˜• ๋ถ€๋“ฑ์‹์„ ํ™œ์šฉํ•˜์—ฌ ์‚ฌ๊ฐํ˜•์ด ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธ
ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  # ๋„ค ๋ณ€์˜ ๊ธธ์ด๋ฅผ a, b, c, d๋ผ ํ•  ๋•Œ,
ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  # ๊ฐ€์žฅ ๊ธด ๋ณ€ < ๋‚˜๋จธ์ง€ ์„ธ ๋ณ€์˜ ํ•ฉ์ด์–ด์•ผ ์‚ฌ๊ฐํ˜• ํ˜•์„ฑ ๊ฐ€๋Šฅ
ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  sides = [side1, side2, side3, side4]
ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  sides.sort()
ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  
ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  if sides[3] < sides[0] + sides[1] + sides[2]:
ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  return True
 
ย  ย  return False
ย  ย  # ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ๋ณ€์˜ ๊ธธ์ด์™€ ์‚ผ๊ฐํ˜• ์Œ์— ๋Œ€ํ•ด ํ™•์ธ
ย  ย  # ํ•˜๋‚˜๋ผ๋„ ์‚ฌ๊ฐํ˜•์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ๋ฐ”๋กœ True๋ฅผ ๋ฐ˜ํ™˜
ย  ย  # ๋๊นŒ์ง€ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด False๋ฅผ ๋ฐ˜ํ™˜
 
 
n = int(sys.stdin.readline())
 
tri = []
 
for _ in range(n):
ย  ย  a, b, c = map(int, sys.stdin.readline().split())
ย  ย  tri.append((a, b, c))
 
# ๊ฒฐ๊ณผ ์ถœ๋ ฅ
if sq_check(tri):
ย  ย  print(1)
else:
ย  ย  print(0)