★[python_파이썬_set과 집합]프로그래머스_LV0_겹치는 선분의 길이_풀이

2024. 5. 22. 19:32코드리뷰

728x90
반응형

공부하는허딩크 : https://www.youtube.com/live/Io7CilXhjrk?feature=shared

LV0의 마지막 문제였다.

문제를 바라볼때 개인적으로 수학적 지식이 부족하다고 느꼈다.

1, 2, 3이 나올때 선분의 길이 2이면 숫자를 3개를 보는게 아니라 2개를 봐야 하는 점을 아예 깨닫지 못하고 있었다.

 

<첫번째 시도 : 틀렸습니다.>

#방향을 잘못 설정했나??? 이러면 숫자기준으로 동일하면 cnt가 되는건데 문제의 의도는 그게 아님
def solution1(lines):
    answer = 0
    temp = []
    for x, y in lines:
        for i in range(x, y + 1):
            temp.append(i)
   
    temp_set = set(temp)
    for i in temp_set:
        if temp.count(i) >= 2:
            answer += 1
   
    return answer
 

<두번째 시도 : 틀렸습니다.>

#아래 코드를 조금 더 발전시킴 => 40점
def solution2(lines):
    answer = 0
    temp = []
    for x, y in lines:
        for i in range(x, y + 1):
            temp.append(i)
   
    temp_a = []
    temp_set = set(temp)
    for i in temp_set:
        if temp.count(i) >= 2:
            temp_a.append(i)
   
    for i in range(len(temp_a) - 1):
        if temp_a[i + 1] - temp_a[i] == 1: #여기서 index error
            answer += 1
       
    return answer

 

<세번째 시도 : 틀렸습니다.>

방향을 다르게 해서 생각을 했다. 교집합과 합집합을 이용한다는 점에서 방향을 올바르게 가져갈 수 있었으나

마지막이 부족했다.

#방향을 다르게 생각해서 작성 => 30점 : union하면 오류 발생 => set을 활용해서 집합을 하는 방향은 맞는거 같음
def solution3(lines): # 이 방법도 맞긴한데 끝에 + 1이 차이를 만듬
    answer = 0
    A = set(i for i in range(lines[0][0]+1,lines[0][1]+1))
    B = set(i for i in range(lines[1][0]+1,lines[1][1]+1))
    C = set(i for i in range(lines[2][0]+1,lines[2][1]+1))
   
    temp = list((A&B)|(A&C)|(B&C))
   
    for i in range(1, len(temp)):
        if temp[i] - temp[i - 1] != 1:
            continue
        else:
            answer += 1
    return answer

 

<네번째 시도 : 맞았습니다. : 다른 사람 풀이 참고함>

세번째 정답에서 교집합들의 합집합의 방향을 참고하고, 끝점을 제외하는 코드를 작성했다.

#중요 포인트 : 끝점이 같은게 아니라 시작점이 같은 걸 찾아야함
def solution(lines):
    temp = []
    for line in lines:
        temp.append(set(range(line[0], line[1])))
   
    return len(temp[0]&temp[1]|temp[0]&temp[2]|temp[1]&temp[2])

 


def solution(lines):
    temp = list(set(range(min(i), max(i))) for i in lines)
    return len(temp[0]&temp[1]|temp[0]&temp[2]|temp[1]&temp[2])

 

<코드 정리>

1. range(A, B)를 객체로 주고 list()또는 set()으로 반환하면 리스트 또는 튜플로 만들어진다.

2. [range(A, B)] 와 list(range(A, B))는 다른 결과를 만들어 낸다.

[]는 리스트 리터럴로, 리스트를 직접 정의할 때 사용된다. []안에 직접 값을 넣어 리스트를 만들 수 있다.

list()는 리스트 생성자다. 이 생성자는 다른 이터러블(예, 튜플, 문자열, range 객체 등)을 인자로 받아 이를 리스트로 변환한다.

즉, []는 직접 값을 넣는건데, list()는 대상을 받아서 이걸 리스트로 변환하는거네.....

3. 단, set(list(), list()) 이런 구조는 안된다. => set(list())의 구조는 가능함.

    ㄴ 가능 temp = [set(range(min(i), max(i))) for i in lines]
    ㄴ 가능 temp = list(set(range(min(i), max(i))) for i in lines)
    ㄴ 불가능 temp = set(list(range(line[0], line[1])) for line in lines) ==> set()안에 list(), list() 이렇게 2번 들어감.

728x90
반응형