개발/algorithm
[프로그래머스][level2] 교점에 별 만들기 - python
zzi_on2
2022. 3. 29. 22:28
문제 링크
풀이
- 처음에 몇 개의 테스트 케이스가 실패했는데
이는 min_x와 min_y 값을 0으로 두었기 때문이다. 마이너스 값도 존재하기 때문에 -int(1e9)를 최솟값으로 설정
- 아래 코드는 27, 28번 테스트 케이스에 대해서 시간 초과가 발생하였다.
이는 최대 100,000 이라 곱했을 경우 int(1e9)을 넘어가기 때문에 발생하는 듯 했다.
def solution(line):
answer = []
result = []
graph = []
min_x = int(1e9)
min_y = int(1e9)
max_x = -int(1e9)
max_y = -int(1e9)
for i in range(len(line)):
for j in range(i+1, len(line)):
a, b, e = map(int,line[i])
c, d, f = map(int,line[j])
if (a*d - b*c) != 0 :
x = (b*f - e*d) / (a*d - b*c)
y = (e*c - a*f) / (a*d - b*c)
if int(x) == x and int(y) == y:
if (x,y) not in result :
x = int(x)
y = int(y)
result.append((x,y))
max_x = max(max_x, x)
min_x = min(min_x, x)
min_y = min(min_y, y)
max_y = max(max_y, y)
graph = [ ['.'] * (abs(max_x-min_x)+1) for _ in range(abs(max_y-min_y)+1)]
for x,y in result :
a = abs(max_y - y)
b= abs(min_x - x)
graph[a][b] = '*'
for i in graph:
answer.append("".join(i))
return answer
따라서 INF = float('inf')로 변경하니 해결
def solution(line):
answer = []
# 교점의 좌표 저장할 배열
result = []
graph = []
INF = float('inf')
# 최소한의 크기만 나타내야 하므로 x,y 좌표의 최대, 최소 저장할 변수
min_x = INF
min_y = INF
max_x = -INF
max_y = -INF
# 직선 간의 교점 구하기
for i in range(len(line)):
for j in range(i+1, len(line)):
a, b, e = map(int,line[i])
c, d, f = map(int,line[j])
# 분모가 0이 아니면
if (a*d - b*c) != 0 :
# x, y 좌표 구하기
x = (b*f - e*d) / (a*d - b*c)
y = (e*c - a*f) / (a*d - b*c)
# 둘 다 정수이면
if int(x) == x and int(y) == y:
# 이미 존재하는 교점이 아니면
if (x,y) not in result :
x = int(x)
y = int(y)
# 배열에 저장
result.append((x,y))
# x,y 좌표의 최대, 최소 구하기
max_x = max(max_x, x)
min_x = min(min_x, x)
min_y = min(min_y, y)
max_y = max(max_y, y)
# "."으로 이루어진 그래프 만들기
graph = [ ['.'] * (abs(max_x-min_x)+1) for _ in range(abs(max_y-min_y)+1)]
# 별 찍기
for x,y in result :
a = abs(max_y - y)
b= abs(min_x - x)
graph[a][b] = '*'
for i in graph:
answer.append("".join(i))
return answer