프로그래머스 교점에 별 만들기 코드 및 해설 (파이썬)

2021. 10. 13. 18:08algorithm

반응형

https://programmers.co.kr/learn/courses/30/lessons/87377

 

코딩테스트 연습 - 10주차

[[2, -1, 4], [-2, -1, 4], [0, -1, 1], [5, -8, -12], [5, 8, 12]] ["....*....", ".........", ".........", "*.......*", ".........", ".........", ".........", ".........", "*.......*"] [[0, 1, -1], [1, 0, -1], [1, 0, 1]] ["*.*"] [[1, -1, 0], [2, -1, 0], [4, -

programmers.co.kr

 

문제에 제시된 참고사항을 참고해 두 직선의 모든 좌표가 정수인 교점을 구하는 함수 intersection_point를 만들었다.

solution 함수에선 입력으로 주어진 모든 직선을 2개씩 짝지어 교점을 구하고, 이들을 points라는 집합에 저장했다. 각 교점의 x좌표의 최대, 최솟값과 y좌표의 최대, 최솟값을 구해 최종 반환값의 크기를 파악했다. 이 크기에 맞게 우선 . 으로 초기화하고, 각 점을 하나씩 확인하면서 해당하는 위치에 *을 그려준다. 

 

 

from itertools import combinations

# 두 직선의 모든 좌표가 정수인 교점 구하기
def intersection_point(line1, line2):
    a,b,e = line1
    c,d,f = line2
    if a*d == b*c:
        return None
    x = (b*f-e*d)/(a*d-b*c)
    y = (e*c-a*f)/(a*d-b*c)
    if x == int(x) and y == int(y):
        return (int(x),int(y))
    
def solution(line):
    N = len(line)
    # 두 직선씩 짝지어 교점 구하기 
    combs = list(combinations(line,2))
    points = set()
    for comb in combs:
        point = intersection_point(comb[0], comb[1])
        if point:
            points.add(point)
            
    # 교점의 x좌표들 
    xs = [p[0] for p in points]
    x_min = min(xs)
    x_max = max(xs)
    
    # 교점의 y좌표들
    ys = [p[1] for p in points]
    y_min = min(ys)
    y_max = max(ys)
    
    # 모두 . 으로 초기화 
    answer = ['.' * (x_max-x_min+1)] * (y_max-y_min+1)
    # 각 좌표마다 * 그리기 
    for point in points:
        x,y = point
        answer[y_max-y] = answer[y_max-y][:x-x_min] + '*' + answer[y_max-y][x-x_min+1:]
     
    return [''.join(ans) for ans in answer]
반응형