코테 준비
[프로그래머스] 교점에 별 만들기
박수련
2024. 2. 29. 23:43
문제 요약
https://school.programmers.co.kr/learn/courses/30/lessons/87377
line 배열에 여러 개의 직선값들이 주어지고 직선들의 교점을 구해서 다음과 같이 출력하는 문제이다.
이때 교점( * )을 포함하는 사각형을 최소한의 크기로 출력을 해야한다.
접근
일단 문제에 다음과 같이 참고 사항이 있어 이중 for문으로 해당 조건에 부합할 때의 x, y값을 각각 meet_x와 meet_y 배열에 저장해주었다. 이렇게 따로 저장해준 이유는 뒤에서 각 교점들의 x값과 y값의 최대최소를 보다 편리하게 구하기 위함이다.
x값과 y값의 각 최대 최소값을 사용해 출력할 사각형의 최소크기를 구했다.
height = max(meet_y) - min(meet_y)
width = max(meet_x) - min(meet_x)
graph = [["."] * (width+1) for _ in range(height+1)]
출력값에서의 좌표는 (0,0) 좌표를 기준으로 얼마나 떨어져 있는지이기 때문에
x 좌표는 (가장 좌측 상단 y좌표 - 교점의 y좌표) 이고,
y 좌표는 (교점의 x좌표 - 가장 좌측 상단 x좌표) 이다.
new_x = srt_y - meet_y[i]
new_y = meet_x[i] - srt_x
이렇게 구한 새로운 좌표에 ( * )을 넣어서 결과값을 출력해주었다.
코드
def solution(line):
# 교점 구하기
leng = len(line)
meet_x = []
meet_y = []
for i in range(leng):
a, b, e = line[i]
for j in range(i + 1, leng):
c, d, f = line[j]
# 두 직선이 평행 또는 일치
if a * d - b * c == 0:
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):
meet_x.append(int(x))
meet_y.append(int(y))
# 그래프 크기 정하기
height = max(meet_y) - min(meet_y)
width = max(meet_x) - min(meet_x)
graph = [["."] * (width+1) for _ in range(height+1)]
# 좌표 변환하여 그래프에 별 표시하기
srt_x, srt_y = min(meet_x), max(meet_y) # 출력값의 좌측 상단 좌표
for i in range(len(meet_x)):
new_x = srt_y - meet_y[i]
new_y = meet_x[i] - srt_x
graph[new_x][new_y] = "*"
answer=[]
for i in range(height+1):
tmp=""
for j in range(width+1):
tmp+=graph[i][j]
answer.append(tmp)
# print(answer)
return answer