본문 바로가기

알고리즘/Python

[Python | 프로그래머스] 겹치는 선분의 길이

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

선분 3개가 평행하게 놓여 있습니다. 세 선분의 시작과 끝 좌표가 [[start, end], [start, end], [start, end]] 형태로 들어있는 2차원 배열 lines가 매개변수로 주어질 때, 두 개 이상의 선분이 겹치는 부분의 길이를 return 하도록 solution 함수를 완성해보세요.

lines가 [[0, 2], [-3, -1], [-2, 1]]일 때 그림으로 나타내면 다음과 같습니다.

선분이 두 개 이상 겹친 곳은 [-2, -1], [0, 1]로 길이 2만큼 겹쳐있습니다.

 

제출 답안은 없다.

겹치는 선분이 두 개로 나뉘는 경우의 테스트케이스에서 오류가 나는 것 같아서 수정했는데

해당 오류가 아닌 것 같다.

테스트케이스 8/10를 통과했는데 결국 해결하지 못 함.

import numpy as np

def solution(lines):
    answer = 0
    
    line1 = [i for i in range(lines[0][0], lines[0][1]+1)]
    line2 = [i for i in range(lines[1][0], lines[1][1]+1)]
    line3 = [i for i in range(lines[2][0], lines[2][1]+1)]
    
    newline1 = list(set(line1).intersection(line2))
    newline2 = list(set(line2).intersection(line3))
    newline3 = list(set(line3).intersection(line1))
        
    newline = []
    if len(newline1)>=2:
        newline += newline1
    if len(newline2)>=2:
        newline += newline2
    if len(newline3)>=2:
        newline += newline3
    
    if len(newline)==0:
        return 0
    
    newline = list(set(newline))
    result = split_consecutive_numbers(newline)
    
    if len(result)==1:
        return len(result)-1
    else:
        return len(result[0])+len(result[1])-2


def split_consecutive_numbers(lst):
    result = []
    temp = [lst[0]]
    for i in range(1, len(lst)):
        if lst[i] - lst[i-1] == 1:
            temp.append(lst[i])
        else:
            result.append(temp)
            temp = [lst[i]]
    result.append(temp)
    return result

 

개선 답안1

  • & : 교집합 연산자
  • | : 합집합 연산자
def solution(lines):
    line1 = set(i for i in range(lines[0][0], lines[0][1]))
    line2 = set(i for i in range(lines[1][0], lines[1][1]))
    line3 = set(i for i in range(lines[2][0], lines[2][1]))
    
    return len((line1&line2) | (line1&line3) | (line2&line3))

 

개선 답안2

def solution(lines):
    answer = 0
    count = [0 for _ in range(200)] # -100 ~ 100 까지의 범위에서 해당 점에 선분이 그어진 횟수
    for line in lines:
        for i in range(line[0], line[1]): 
            count[i + 100] += 1
    answer += count.count(2) # 두 개 이상 겹친 점
    answer += count.count(3) # 세 개 이상 겹친 점
    return answer

 

참고 자료

https://school.programmers.co.kr/learn/courses/30/lessons/120876/solution_groups?language=python3 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

https://dduniverse.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EA%B2%B9%EC%B9%98%EB%8A%94-%EC%84%A0%EB%B6%84%EC%9D%98-%EA%B8%B8%EC%9D%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-python

 

프로그래머스 | 겹치는 선분의 길이 [파이썬 python]

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 코드 def

dduniverse.tistory.com