출처: 프로그래머스 코딩 테스트 연습, [프로그래머스] 교점에 별 만들기
문제에서 알려준 대로 그대로 구현하였다.
1. 교점이 정수인지 실수인지 확인하는 메서드를 만든다. 잘 만들었는지 모르겠지만 작동하긴 한다.
2. 주어진 선분의 정보를 이중 for문을 돌려서 정수인 교점만 교점 리스트에 저장한다.
3. 맵을 그리기 위해 x축으로 가장 큰 좌표와 작은 좌표, y축으로 가장 큰 좌표와 작은 좌표를 구한다.
4. 위에서 구한 최대, 최소 좌표들로 맵의 가로 세로를 정해여 그린다.
5. 정수인 교점을 맵에 그려준다.
6. 맵이 상하 반전이기 때문에 상하로 뒤집어 준다.
def solution(line):
# 실수인지 정수인지 판단하는 메서드
def check_int(n1, n2):
if float(n1) == int(n1) and float(n2) == int(n2):
return True
return False
# 정수인 교점을 저장하는 리스트
point = []
for A, B, E in line:
for C, D, F in line:
if A == C and B == D and E == F:
continue
if A * D == B * C:
continue
x = (B * F - E * D) / (A * D - B * C)
y = (E * C - A * F) / (A * D - B * C)
if check_int(x, y):
point.append((int(x), int(y)),)
# 맵의 가로, 세로 크기를 구하기 위해 최소, 최대값 구하기
min_x = min(point, key=lambda x: x[0])[0]
max_x = max(point, key=lambda x: x[0])[0]
min_y = min(point, key=lambda x: x[1])[1]
max_y = max(point, key=lambda x: x[1])[1]
star_map = [['.' for _ in range(max_x - min_x + 1)] for _ in range(max_y - min_y + 1)]
# 해당되는 교점에 별 찍기
for x, y in point:
star_map[y - min_y][x - min_x] = '*'
# 상하반전되어 있는 리스트를 반전시키고 문자열로 변환
answer = []
for line in star_map[::-1]:
answer.append(''.join(line))
return answer