본문 바로가기
Programming/Programmers

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

by 데이터현 2021. 11. 3.

https://programmers.co.kr/learn/courses/30/lessons/87377

 

코딩테스트 연습 - 교점에 별 만들기

[[2, -1, 4], [-2, -1, 4], [0, -1, 1], [5, -8, -12], [5, 8, 12]] ["....*....", ".........", ".........", "*.......*", ".........", ".........", ".........", ".........", "*.......*"] [[0, 1, -1], [1, 0, -1], [1, 0, 1]] ["*.*"] [[1, -1, 0], [2, -1, 0], [4, -

programmers.co.kr

 

2차원 평면상의 좌표와 2차원 배열의 좌표를 구하는데 시간이 오래 걸렸던 문제다.

 

알고리즘은 다음과 같다.

1. ad-bc != 0이 아닌 조건을 통해 교점을 구하고, 정수로 나타낼 수 있는 교점일 경우 교점 리스트에 추가해준다.

2. 교점의 집합에서 x, y 좌표의 최댓값과 최솟값을 구해서 2차원 배열을 초기화시켜준다.

3. 2차원 평면상의 좌표를 2차원 배열의 좌표로 찍어내려면 

    x, y = abs(y_max-b) , abs(x_min-a)의 공식으로 구할 수 있다.

 

나의 풀이

def solution(line):
    star_list = []
    for i in range(len(line)):
        for j in range(i+1,len(line)):
            a, b, e = line[i]
            c, d, f = line[j]
            if a*d - b*c !=0:
                x,y = (b*f-e*d)/(a*d - b*c) , (e*c-a*f)/(a*d - b*c)
                if x.is_integer() and y.is_integer():
                    x,y = int(x),int(y)
                    if (x,y) not in star_list:
                        star_list.append((x,y))
    x_min, x_max, y_min, y_max = min(star_list)[0],max(star_list)[0],min(star_list,key = lambda x: x[1])[1],max(star_list,key = lambda x: x[1])[1]
    star = [['.']*(abs(x_max-x_min)+1) for _ in range((abs(y_max-y_min)+1))]
    for s in star_list:
        a,b = s
        x,y = abs(y_max-b) , abs(x_min-a)
        star[x][y] = '*'
    for i,v in enumerate(star):
        star[i] = ''.join(v)
    return star

댓글