처음부터 역순으로 진행해서 문제를 풀면 이러한 비용을 걱정할 필요 없이 바로 답을 만들 수 있으나 지금 시점에서는 조금 어려울 수 있습니다. 이번 문제에서는 이 정도의 추가 비용은 전혀 문제가 되지 않으므로 시간 복잡도를 약간 희생하는 방향으로 진행했습니다.
이렇게 정답 코드가 완성되었습니다. 여러분이 작성한 코드와 비교해서 다른 점이 있는지 살펴보세요.
전체 코드
3장/교점에_별_만들기.py
def solution(line):
#prevent swallow copy
pos, answer = [], []
n = len(line)
x_min = y_min = int(1e15)
x_max = y_max = -int(1e15)
for i in range(n):
a, b, e = line[i]
for j in range(i + 1, n):
c, d, f = line[j]
if a * d == b * c :
continue
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):
x = int(x)
y = int(y)
pos.append([x,y])
if x_min > x: x_min = x
if y_min > y: y_min = y
if x_max < x: x_max = x
if y_max < y: y_max = y
x_len = x_max - x_min + 1
y_len = y_max - y_min + 1
coord = [['.'] * x_len for _ in range(y_len)]
for star_x, star_y in pos:
nx = star_x + abs(x_min) if x_min < 0 else star_x - x_min
ny = star_y + abs(y_min) if y_min < 0 else star_y - y_min
coord[ny][nx] = '*'
for result in coord: answer.append(''.join(result))
return answer[::-1]