코테 준비

[프로그래머스] 교점에 별 만들기

박수련 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