[프로그래머스] 교점에 별 만들기

최동혁·2022년 12월 20일
0

프로그래머스

목록 보기
31/68

풀이 방법

문제 가장 밑에 교점을 구하는 공식이 있다.
line의 데이터 범위는 1000개 이기 때문에 완전 탐색으로 교점을 찾아도 괜찮다.
교점을 전부 찾은 후, 가로의 길이와 세로의 길이를 구한다
세로의 길이 중 가장 큰 값을 기준 0 으로 삼고 행으로 index 값을 바꾼다
가로의 길이 중 가장 작은 값을 기준 0 으로 삼고 열로 index 값을 바꾼다
방문 배열을 만들어 교점인 곳을 True로 설정하고 루프 돌면서 정답 출력!

할 말

  • 그냥 더러운 문제다.
  • 이거 하나 못풀었다고 실망하지 말자
  • 뭔가 삼성 코테스러운 문제다.

풀이 코드

def solution(line):
    answer = []
    cross = []
    for i in range(len(line)):
        for j in range(i + 1, len(line)):
            a, b, e = line[i]
            c, d, f = line[j]
            ad_bc = a * d - b * c
            bf_ed = b * f - e * d
            ec_af = e * c - a * f
            if ad_bc != 0:
                if bf_ed % ad_bc == 0 and ec_af % ad_bc == 0:
                    cross.append((bf_ed // ad_bc, ec_af // ad_bc))
                    
    cross_sero = sorted(cross, key = lambda x : x[1])
    cross_garo = sorted(cross)
    
    if cross_sero[0] == cross_sero[-1]:
        return ["*"]
    else:
        max_sero = cross_sero[-1][1] - cross_sero[0][1] + 1
        max_garo = cross_garo[-1][0] - cross_garo[0][0] + 1
        
        visited = [[False for _ in range(max_garo)] for _ in range(max_sero)]
        start_x = cross_garo[0][0]
        start_y = cross_sero[-1][1]
        
        for x, y in cross_sero:
            nx = x - start_x
            ny = start_y - y
            visited[ny][nx] = True
        
        for y in range(max_sero):
            tmp = ""
            for x in range(max_garo):
                if visited[y][x]:
                    tmp += "*"
                else:
                    tmp +="."
            answer.append(tmp)
    
    return answer
profile
항상 성장하는 개발자 최동혁입니다.

0개의 댓글