알고리즘 연습/구현, 문자열

[Lv.2 / 프로그래머스 / 파이썬] 교점에 별 만들기

김세진 2025. 7. 1. 09:15
반응형

 

 

 

 

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

풀이

 

주어진 직선들의 교점을 구해, 그 자리에 별을 찍어 출력해야 한다.

참고 사항을 확인하여 교점을 구하는 방법을 알 수 있다.

정수로 표현되는 교점에만 별을 찍어야 함에 유의해야 한다.

 

우선 모든 교점을 다 구한 다음, 교점 좌표의 x,y별 min, max값을 구해 그 크기만큼의 배열을 생성한다.

이제 구한 교점들을 순회하며 좌표를 배열의 인덱스에 맞게끔 민맥싱하여 별을 찍어주면 된다.

 

def solution(line):
    N = len(line)
    cand = set()
    
    min_x = min_y = float('inf')
    max_x = max_y = -float('inf')
    
    # 모든 직선을 서로 비교
    for i in range(N):
        for j in range(i+1, N):
            point = get_xy(line[i], line[j])
            if not point:
                continue
            
            x, y = point
            min_x = min(min_x, x); max_x = max(max_x, x)
            min_y = min(min_y, y); max_y = max(max_y, y)
            
            cand.add(point)
    
    # 필요한 넓이만큼 좌표 평면 생성
    board = [["."] * (max_x - min_x+ 1) for _ in range(max_y - min_y  + 1)]
    
    # 별 찍기
    for x, y in cand:
        board[max_y - y][x - min_x] = '*'
    
    return [''.join(row) for row in board]
            

def get_xy(l1, l2):
    a, b, e = l1
    c, d, f = l2
    
    # 두 직선이 평행 또는 일치인 경우
    if a*d - b*c == 0:
        return None
    
    x = (b*f - e*d) / (a*d - b*c)
    y = (e*c - a*f) / (a*d - b*c)
    
    # 나누어 떨어지지 않는 경우
    if x != int(x) or y != int(y):
        return None
    
    return (int(x), int(y))

 

 

 

 

 

반응형