[Problem Solving] 교점에 별 만들기

Sean·2023년 12월 1일
0

Problem Solving

목록 보기
129/130

문제

https://school.programmers.co.kr/learn/courses/30/lessons/87377

풀이

아이디어

  • 아이디어 같은 건 없고 문제에서 힌트 준 수식을 가지고 쭉 구현하면 된다.
  • 그런데, 시간 초과가 안 나게 조심해야 한다.
  • 구해진 교점들을 집합(set)에 넣고 하나씩 순회하면서 xmax, xmin, ymax, ymin값을 갱신시켜나갔는데, 이렇게 하니까 시간초과가 났다. (27, 28번에서만)
    • 그런데 왜인지 모르겠다... 교점이 아무리 많아도 시간초과 날 만큼 생기지 않을 것 같은데 흠...
    • 그래서 다른 방식으로 구해줬는데, 파이썬의 max, min함수에도 sort 함수처럼 key 매개변수에 lambda를 통해서 원하는 방향을 지정해줄 수가 있었다. 예를 들어, 다음과 같이 코드를 작성하면, (a, b)와 같은 형태의 튜플들이 저장되어있는 집합에서 첫번째 원소가 가장 큰 튜플을 반환해줄 수가 있다.
xmax = max(coord_set, key=lambda x:x[0])[0]
  • 또 하나의 인사이트는 우리가 구한 값이 정수인지 아닌지를 확인할 때, x == int(x)와 같이 조건을 체크해줄 수 있다는 점이다.
    (뭐 나머지 연산을 통해서 나머지가 있는지 없는지 체크를 해도 되겠지만 말이다)
    • 주의) 나눗셈 결과가 정수값과 동일함을 확인한 후, 정수값을 반환하고 싶다면 x가 아니라 int(x)를 반환해야 한다. 3.0 == 3 이게 True를 반환하기 때문에, 무조건 정수로 변환해서 반환해야 한다.

코드

from itertools import combinations

def solution(line):
    INF = int(2e9)
    
    def getPoint(a, b, e, c, d, f):
        x_son = b*f - e*d
        y_son = e*c - a*f
        mother = a*d - b*c
        if mother == 0:
            return False
        
        x = x_son / mother
        y = y_son / mother
        
        if x == int(x) and y == int(y):
            return (int(x), int(y))
    
    coord_set = set()
    combs = combinations(line, 2)
    for comb in combs:
        a, b, e = comb[0]
        c, d, f = comb[1]
        point = getPoint(a, b, e, c, d, f)
        if point:
            coord_set.add(point)

    xmax, xmin =  max(coord_set, key=lambda x:x[0])[0], min(coord_set, key=lambda x:x[0])[0]
    ymax, ymin =  max(coord_set, key=lambda x:x[1])[1], min(coord_set, key=lambda x:x[1])[1]
    
    answer = [['.'] * (xmax-xmin+1) for _ in range(ymax-ymin+1)]
    
    for x, y in coord_set:
        answer[ymax-y][x-xmin] = '*'
    
    return [''.join(row) for row in answer]
profile
여러 프로젝트보다 하나라도 제대로, 깔끔하게.

0개의 댓글