알고리즘 연습/구현, 문자열
[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))
반응형