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

2024. 12. 24. 17:59·CODING_TEST

※ 문제

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

 

프로그래머스

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

programmers.co.kr

 

 

 

※ 문제 설명

  • Ax + By + C = 0으로 표현할 수 있는 n개의 직선이 주어질 때, 이 직선의 교점 중 정수 좌표에 별을 그리려 합니다.


제한사항

  • line의 세로(행) 길이는 2 이상 1,000 이하인 자연수입니다.
    • line의 가로(열) 길이는 3입니다.
    • line의 각 원소는 [A, B, C] 형태입니다.
    • A, B, C는 -100,000 이상 100,000 이하인 정수입니다.
    • 무수히 많은 교점이 생기는 직선 쌍은 주어지지 않습니다.
    • A = 0이면서 B = 0인 경우는 주어지지 않습니다.
  • 정답은 1,000 * 1,000 크기 이내에서 표현됩니다.
  • 별이 한 개 이상 그려지는 입력만 주어집니다.

입출력 예

line result
[[2, -1, 4], [-2, -1, 4], [0, -1, 1], [5, -8, -12], [5, 8, 12]] ["....*....", ".........", ".........", "*.......*", ".........", ".........", ".........", ".........", "*.......*"]
[[0, 1, -1], [1, 0, -1], [1, 0, 1]] ["*.*"]
[[1, -1, 0], [2, -1, 0]] ["*"]
[[1, -1, 0], [2, -1, 0], [4, -1, 0]] ["*"]

참고 사항

해당하는 참고사항으로 문제를 풀이

 


※ 나의 풀이

  • cal_point(line1, line2)를 통해 참고사항을 고려한 함수 생성
  • for loop를 통해 line1 과 다른 line2를 cal_point 호출하여 반환값이 존재한다면, arr 배열에 추가
  • 최종 answer 조건에 맞는 배열 사이즈를 위해 x축, y축 min(), max()값 선언
  • answer배열을 '.'으로 되어있는 것들로 먼저 선언 후 교점 값을 '*'로 변경
def cal_point(line1, line2):
    """
    line1, line2 : 서로 다른 두개의 직선
    두 개의 직선 간 교점이 없는 경우 -> return None
    교점이 있는 경우 -> return [x, y]
    """
    a, b, e = line1
    c, d, f = line2
    
    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) and y == int(y):
        # 소수점 제거
        x = int(x)
        y = int(y)
        return [x, y]
    else:
        return None
    
def solution(line):
    arr = []

    for i in range(len(line)):
        for j in range(i + 1, len(line)):
            if line[i] == line[j]:
                continue
            pos_x_y = cal_point(line[i], line[j])
            if pos_x_y:
                arr.append(pos_x_y)
            
    min_x = min(x for x, y in arr)
    max_x = max(x for x, y in arr)
    min_y = min(y for x, y in arr)
    max_y = max(y for x, y in arr)

    x_len = max_x - min_x + 1
    y_len = max_y - min_y + 1
    
    ans_arr = [['.'] * x_len for _ in range(y_len)]
    
    # 교점 찍기
    for x, y in arr:
        x = x - min_x
        y = max_y - y
        ans_arr[y][x] = '*'
        
    ans_arr = [''.join(row_ans) for row_ans in ans_arr]
    
    return ans_arr

 

'CODING_TEST' 카테고리의 다른 글

[백준/Python] 5525. IOIOI  (0) 2024.12.26
[프로그래머스/Python] 피보나치 수  (0) 2024.12.25
[프로그래머스/Python] 올바른 괄호  (0) 2024.12.18
[프로그래머스/Python] 옹알이 (2)  (0) 2024.12.17
[프로그래머스/Python] [PCCE 기출문제] 10번 / 데이터 분석  (0) 2024.12.17
'CODING_TEST' 카테고리의 다른 글
  • [백준/Python] 5525. IOIOI
  • [프로그래머스/Python] 피보나치 수
  • [프로그래머스/Python] 올바른 괄호
  • [프로그래머스/Python] 옹알이 (2)
YAHO_STUDY
YAHO_STUDY
DATA&AI_study.zip
  • YAHO_STUDY
    YAHO_CODE
    YAHO_STUDY
  • 전체
    오늘
    어제
    • 분류 전체보기 (57)
      • Paper Review (0)
      • SQL (16)
      • CODING_TEST (21)
      • Time Series (0)
      • DL (20)
        • NLP (5)
        • LLM&RAG (15)
        • Recommender System (0)
      • 최적화 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    prompt-tuning
    graph
    boj
    양자화
    PEFT
    qlora
    DP
    coding_test
    pagedattention
    runpod
    quantization
    RNN
    fine-tuning
    Lora
    SQL
    Programmers
    Gemma
    한 권으로 끝내는 실전 llm 파인튜닝
    hash
    MySQL
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
YAHO_STUDY
[프로그래머스/Python] 교점에 별 만들기
상단으로

티스토리툴바