Algorithm/프로그래머스

(파이썬) [위클리 챌린지 10주차] - 교점에 별 만들기

Jesse 2021. 10. 15. 00:01

프로그래머스 10주차 - 교점에 별 만들기

 

코딩테스트 연습 - 10주차

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

프로그래머스 위클리 챌린지 10주차 문제인 교점에 별 만들기를 풀어 보았다.

 

 

풀이 방식

  1. 인풋 안에 있는 직선들끼리 접점이 있는지 탐색
    1. if를 사용해서 접점이 있고 정수로만 표현될수 있는 좌표 찾기
    2. 정수로만 표현되는 접점들을 따로 list에 담기
  2. 모든 별을 포함하는 최소한의 크기의 격자판으로 나타내야 한다
    1. 격자판에서 동서남북 방향으로 가장 끝에 위치한 좌표를 저장
    2. matrix에서 인덱스가 높을수록 반대로 아래에 위치한다
    3. 나중에 다 만들어 놓고 뒤집어도 되고 아니면 좌표들의 y값에 - 싸인을 붙여서 음양 기호를 뒤집자
  3. 격자판을 만들자
    1. Row는 남에서 북까지의 차이
    2. Column은 서에서 동까지의 차이
    3. '.'으로 채운다
  4. 이제 아까 찾은 접점들을 저장한 list를 돌면서 해당 지점들을 '.'이 아닌 '*'로 바꿔준다
  5. 문제에서는 격자의 row들을 하나의 문자열로 원하기 때문에 list를 하나의 문자열로 붙여준다

 

코드

def solution(line):
    answer, points = [], []
    
    for i in range(len(line)):
        a,b,e = line[i]        
        
        for j in range(i+1, len(line)):
            
            c,d,f = line[j]
            
            if a*d - b*c != 0 and (b*f-e*d)%(a*d-b*c) == 0 and (e*c-a*f)%(a*d-b*c)==0:
                
                x = (b*f-e*d)//(a*d-b*c)
                y = -(e*c-a*f)//(a*d-b*c)
                    
                if len(points) == 0:
                    top, bot = y,y
                    left,right = x,x
                else:                         
                    top = max(top,y)
                    bot = min(bot,y)
                    left = min(left,x)
                    right = max(right,x)
                    
                points.append((x,y))

    for _ in range(top-bot+1):
        answer.append(['.']*(right-left+1))
        
    for x,y in points:
        answer[y-bot][x-left] = '*'
             
    for i in range(len(answer)):
        answer[i] = ''.join(answer[i])
            
    return answer