def solution(line):
INF = float('inf')
mark,L = [],len(line)
minx,maxx,miny,maxy=INF,-INF,INF,-INF
for i in range(L):
for j in range(i,L):
if i==j : continue
A,B,E,C,D,F = *line[i],*line[j]
mo = A*D-B*C
if mo==0: continue
x,y=(B*F-E*D)/mo,(E*C-A*F)/mo
if x-int(x) or y-int(y) : continue
x,y=int(x),int(y)
minx,maxx,miny,maxy = min(minx,x),max(maxx,x),min(miny,y),max(maxy,y)
mark.append((x,y))
res=[['.' for _ in range(maxx-minx+1)] for _ in range(maxy-miny+1)]
for x,y in mark : res[maxy-y][x-minx] = '*'
return [''.join(s) for s in res]
이렇게 수학적인 좌표개념과 컴퓨터에서 사용하는 좌표개념이 혼용되는 문제에서는 이점만 잘 유의해주면 쉽게 접근 할 수 있다.
if (not x.is_integer()) or (not y.is_integer()) : continue
혹은
if (B*F-E*D)%mo or (E*C-A*F)%mo : continue
이런식으로도 표현 할 수 있다.
만약 최대,최소를 구해야되는 문제가 아니었다면 굳이 이중for문으로 탐색하기 보다는 itertools의 combinations 함수를 사용 할 것 같다.
float('inf')
은 최대최소 문제에서 자주 활용되는 기능이니 기억해두면 좋다.