프로그래머스 위클리 챌린지 10주차 교점에 별 만들기

백규현·2021년 10월 12일
1

알고리즘

목록 보기
5/6
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')은 최대최소 문제에서 자주 활용되는 기능이니 기억해두면 좋다.

profile
반갑습니다.

0개의 댓글