선분 3개가 평행하게 놓여 있습니다. 세 선분의 시작과 끝 좌표가 [[start, end], [start, end], [start, end]] 형태로 들어있는 2차원 배열 lines가 매개변수로 주어질 때, 두 개 이상의 선분이 겹치는 부분의 길이를 return 하도록 solution 함수를 완성해보세요.
lines가 [[0, 2], [-3, -1], [-2, 1]]일 때 그림으로 나타내면 다음과 같습니다.
선분이 두 개 이상 겹친 곳은 [-2, -1], [0, 1]로 길이 2만큼 겹쳐있습니다.
lines | result |
---|---|
[[0, 1], [2, 5], [3, 9]] | 2 |
[[-1, 1], [1, 3], [3, 9]] | 0 |
[[0, 5], [3, 9], [1, 10]] | 8 |
입출력 예 설명
for
문으로 모든 조합을 구해야겠네1. answer 초기화
2. for a in range(2):
3. for b in range(a, 3):
4. line = a와 b 선분의 겹치는 길이 계산
5. answer += line
6. return answer
def solution(lines):
ans = 0
for i, j in ((0,1),(0,2),(1,2)):
a, b, = lines[i], lines[j]
# 길이 < 0 -> 겹치지 않음 = 0
ans += max(0, min(a[1], b[1])-max(a[0], b[0]))
return ans
시행착오) 중복되는 길이는 제외해줘야하네
입출력 예3번에서 ([0, 5], [3, 9]) 2, ([0, 5], [1, 10]) 4,([3, 9], [1, 10]) 6로 총 12의 출력값을 얻었는데 결과는 8이다.
구간으로 보았을 때 겹치는 구간이 [3,5], [1,5], [3,9]이다. 총 겹치는 구간은 [1,9]로 8이 된다.
그러면 길이를 계산하는 것이 아니라 겹치는 좌표를 저장하면 될 것 같다.
def solution(lines):
ans = []
for i, j in ((0,1),(0,2),(1,2)):
a, b, = lines[i], lines[j]
# range 함수로 범위를 저장
ans += list(range(max(a[0], b[0]), min(a[1], b[1])))
return len(set(ans)) # 집합으로 변환해 중복 제거
def solution(lines):
sets = [set(range(min(l), max(l))) for l in lines]
return len(sets[0] & sets[1] | sets[0] & sets[2] | sets[1] & sets[2])