[Programmers] 교점에 별 만들기

Updated:

교점에 별 만들기

교점에 별 만들기를 클릭하면 바로 이동한다.

조합을 통해 구할 수 있는 모든 교점을 구한 뒤 별을 찍으면 된다.

실생활에서 사용하는 좌표체계를 컴퓨터가 사용하는 좌표체계로 바꾸는데 굉장한 어려움이 있었다.

이러한 문제가 종종 있으니 규칙을 외워두고 있어야겠다.

(x, y) -> arr[max_y - y][x - min_x] 로 바꿀 수 있다.


from itertools import combinations


def solution(line):
    # Ax + By + E = 0
    # Cx + Dy + F = 0
    # x = BF - ED / AD - BC
    # y = EC - AF / AD - BC
    answer = list()
    cross_point = list()

    # 1. 조합을 통해 모든 선분의 교점을 찾는다.
    for lines in combinations(line, 2):
        A, B, E = lines[0]
        C, D, F = lines[1]

        check = (A * D) - (B * C)

        if check != 0:
            x = ((B * F) - (E * D)) / check
            y = ((E * C) - (A * F)) / check

            # 2. 교점이 정수인 경우에만 리스트에 삽입한다.
            if x == int(x) and y == int(y):
                cross_point.append((int(x), int(y)))

    # 3. 가장 왼쪽 위에 있는 교점과 가장 오른쪽 아래에 있는 교점을 통해 사각형을 그린다.
    cross_point.sort()
    max_x = cross_point[-1][0]
    min_x = cross_point[0][0]
    weight = max_x - min_x

    cross_point.sort(key=lambda i: i[1])
    max_y = cross_point[-1][1]
    min_y = cross_point[0][1]
    height = max_y - min_y

    rectangle = [["." for _ in range(weight + 1)] for _ in range(height + 1)]

    # 4. 교점의 좌표를 알맞게 수정해 별을 그린다.
    for point in cross_point:
        x = point[0]
        y = point[1]
        rectangle[max_y - y][x - min_x] = '*'

    for val in rectangle:
        answer.append("".join(val))
    return answer


if __name__ == "__main__":
    line = [[2, -1, 4], [-2, -1, 4], [0, -1, 1], [5, -8, -12], [5, 8, 12]]
    print(solution(line))



Categories:

Updated:

Leave a comment