본문 바로가기
프로그래머스/2단계

(Python/LV2) 교점에 별 만들기

by windy7271 2022. 12. 1.
728x90
반응형

문제 출처: https://school.programmers.co.kr/learn/courses/30/lessons/87377

풀이:

from itertools import combinations

def meet_spot(x, y):
    a,b,c = x  # ax+by=c
    d,e,f = y  # dx+ey=f
    if a*e == b*d:
        return
    x = (b * f - c * e) / (a * e - b * d)
    y = (c * d - a * f) / (a * e - b * d)
    if x== int(x) and y == int(y) :
        return int(x), int(y)

def solution(line):
    xy_spot = set() # 교점에 들어갈것들
    for a, b in list(combinations(line,2)):
        spot = meet_spot(a,b)
        if spot:
            xy_spot.add(spot)

    y_spot = sorted(xy_spot, key=lambda x : x[1]) # y최소 최대값
    x_spot = sorted(xy_spot, key=lambda x : x[0]) # x 최소 최대

    min_x, max_x =x_spot[0][0],x_spot[-1][0]  # 8
    min_y, max_y =y_spot[0][1],y_spot[-1][1] # 8

    board = [['.'] * (max_x - min_x +1) for _ in range(max_y - min_y +1)]

    for x,y in xy_spot:
        board[max_y - y][x-min_x] = "*"
    res = []
    for i in board:
        res.append("".join(i))
    return res
    # return list(map("".join,board))

mee_spot 은 교점 구하는 공식을 사용하였다. 중학교 공식이다 검색하면 나온다..

 

def solution(line):
    xy_spot = set() # 교점에 들어갈것들
    for a, b in list(combinations(line,2)): # 두 직선씩 골라서
        spot = meet_spot(a,b) # 교점이 있나?? 확인
        if spot: # 있으면 없으면None 이 리턴됨
            xy_spot.add(spot) # 넣어줌

 

y_spot = sorted(xy_spot, key=lambda x : x[1]) # y최소 최대값
x_spot = sorted(xy_spot, key=lambda x : x[0]) # x 최소 최대

min_x, max_x =x_spot[0][0],x_spot[-1][0]   
min_y, max_y =y_spot[0][1],y_spot[-1][1] 


교점중 각 x,y 최솟값 최댓값 구해준다
board = [['.'] * (max_x - min_x +1) for _ in range(max_y - min_y +1)]

# 만약 최소-4,최대 4면 결국 길이 9 니깐 +1 x,y둘다

for x,y in xy_spot:
    board[max_y - y][x-min_x] = "*"
    # 별을 찍어준다. 어렵다 이부분

 

res = []
for i in board:
    res.append("".join(i))
return res
    
    
    
##
    return list(map("".join,board))
    # 이렇게도 할 수 있는데 join 함수에 대해 더 공부해야겠다

 

어떤 대단한 사람은 한줄로 끝내버렸다,,

반응형

댓글