알고리즘/프로그래머스

[위클리 챌린지] 교점에 별 만들기

래울 2021. 11. 4. 21:12

https://programmers.co.kr/learn/courses/30/lessons/87377?language=python3 

 

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

[[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

 

1. 모든 교점을 구한다.

  - 나누는 수가 0일경우, 결과값이 소수가 나올경우 제외

  - is_integer() 사용, 정수값이면 True를 반환

 

2. x, y에 대한 최소, 최대 값을 구한다.

  - 좌표의 범위는 x1 ~ x2, y1 ~ y2

 

3. 해당 좌표의 범위에 맞게 *과 .를 찍어준다.

  - y좌표는 위에서 아래로 그리기 때문에 역순으로 for문을 돌림

def solution(line):
    temp = []
    for i in range(len(line)):
        for j in range(i+1, len(line)):
            d = line[i][0]*line[j][1]-line[i][1]*line[j][0]
            if d == 0:
                continue
            x = (line[i][1]*line[j][2]-line[i][2]*line[j][1])/d
            y = (line[i][2]*line[j][0]-line[i][0]*line[j][2])/d
            if x.is_integer() and y.is_integer():
                temp.append([int(x), int(y)])
    dots = []
    for i in temp:
        if not i in dots:
            dots.append(i)
    x_sort = sorted(dots, key = lambda x : x[0])
    y_sort = sorted(dots, key = lambda x : x[1])
    x1, x2 = x_sort[0][0], x_sort[-1][0]
    y1, y2 = y_sort[0][1], y_sort[-1][1]
    answer = []
    for i in range(y2, y1-1, -1):
        line = ""
        for j in range(x1, x2+1):
            if [j, i] in dots:
                line += '*'
            else:
                line += '.'
        answer.append(line)
    return answer