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

yujeongkwon·2022년 9월 22일
0

프로그래머스 / PYTHON

목록 보기
62/77

문제 설명

교점에 별 만들기
직선 A, B, C에 대한 정보가 담긴 배열 line이 매개변수로 주어집니다. 이때 모든 별을 포함하는 최소 사각형을 return 하도록 solution 함수를 완성해주세요.

풀이 & Comment

별 알고리즘 없는 구현인데 망할 줫나 오래걸림 다시풀어보는 건데도 (정답률이 낮은건 이유가 있다니까 -0-)
풀고도 좀더 이쁘게 정리, 빠르게 고친다고 그런걸거야..
구현이 개딸림 다시풀었는데도 이전의 코드와 속도차이에서는 별 차이가 별로 없었음. 쪼꿈 더 빠르고, 깔끔해진 정도?
근데 다른 사람풀이가 코드도 깔끔하고 속도도 더 빠르길래 참고(뺏김)함.

내코드

def solution(line):
    answer = []
    coord = []
    len_ = len(line)
    maxX,minX,maxY,minY = -10e10, 10e10, -10e10, 10e10
    
    for i in range(len_):
        for j in range(i,len_):
            A,B,E = line[i]
            C,D,F = line[j]
            tmp = A*D-B*C
            if tmp != 0:
                x,y = (B*F-E*D)/tmp, (E*C-A*F)/tmp
                x_ ,y_ = int(x) ,int(y)
                
                if x ==x_ and y == y_:   
                    maxX,minX,maxY,minY = max(maxX,x_),min(minX,x_),max(maxY,y_),min(minY,y_)
                    coord.append((x_,y_))
    print(coord,maxY, minX)
    answer = [["." for c in range(maxX-minX+1)] for r in range(maxY-minY+1)]
    for x, y in coord:  answer[maxY-y][x-minX] = "*"
    return ["".join(row) for row in answer]

옛~날 코드

# 2차원 배열 set 시키고 싶으면 튜플로 저장하고 해야함 list (x)
# 'float' object is not subscriptable
# 위 에러는 list 가 아닌 변수에 인덱스로 접근할 경우 뜨는 에러

def solution(line):
    answer = []
    cd = []
    x = [1e15,-1e15]
    y = [1e15,-1e15]
    for i in range(len(line)):
        for j in range(i,len(line)):
            try:
                x_ = (line[i][1]*line[j][2] - line[i][2]*line[j][1])/(line[i][0]*line[j][1] - line[i][1]*line[j][0])
                y_ = (line[i][2]*line[j][0] - line[i][0]*line[j][2])/(line[i][0]*line[j][1] - line[i][1]*line[j][0])
                if x_ !=0 and y_!= 0:
                    if x_%int(x_) ==0 and y_%int(y_) ==0: cd.append((int(x_),int(y_)))
                elif x_ ==0 and y_!= 0:
                    if y_%int(y_) ==0:    cd.append((int(x_),int(y_)))
                elif x_ !=0 and y_== 0:
                    if x_%int(x_) ==0:    cd.append((int(x_),int(y_)))
                else:   cd.append((int(x_),int(y_)))
            except: continue

    cd = list(set(cd))

    for i in cd:
        if x[0] > i[0]: x[0] = i[0]
        if x[1] < i[0]: x[1] = i[0]
        if y[0] > i[1]: y[0] = i[1]
        if y[1] < i[1]: y[1] = i[1]

    for i in range(y[1],y[0]-1,-1):
        answer.append('')
        for j in range(x[0],x[1]+1):
            if (j,i) in cd:
                cd.remove((j,i))
                answer[-1] += "*"
            else:   answer[-1] += "."
    return answer
profile
인생 살자.

0개의 댓글