[프로그래머스] 평행 - Python3

2024. 12. 27. 14:46·PS

1. 문제 설명

🔗 평행 Lv. 0 문제 해결하러 가기

주어진 네 개의 점을 두 개씩 이었을 때, 두 직선이 평행이 되는 경우가 있으면 1을 없으면 0을 반환하는 문제

 

 

2. 풀이

- 나의 풀이 : remove() 활용하여 두 점 조합 후 계산

def solution(dots):
    lend = len(dots)
    for i in range(lend): # 첫 번째 점 선택
        for j in range(i+1, lend): # 두 번째 점 선택
            s = [0, 1, 2, 3] # 인덱스 리스트
            s.remove(i) # 선택한 첫 번째 점 제외
            s.remove(j) # 선택한 두 번째 점 제외
            
            # 두 점을 잇는 기울기 계산
            slice_1 = (dots[i][0]-dots[j][0])/(dots[i][1]-dots[j][1])
            slice_2 = (dots[s[0]][0]-dots[s[1]][0])/(dots[s[0]][1]-dots[s[1]][1])
            
            # 두 직선의 기울기가 같다면 평행
            if (slice_1 == slice_2):
                return 1

    return 0

모든 두 점의 조합에 대해 기울기를 계산하고, 나머지 두 점의 기울기가 동일하면 평행 여부를 확인한다.

  • 시간 복잡도 O(n^2)
  • 공간 복잡도 O(1)

- 다른 사람의 풀이 : 모든 경우의 수 다 구한 후 계산

def solution(dots):
    [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]=dots
    
    # 점 1-2 이은 직선 1개, 점 3-4 이은 직선 1개
    answer1 = ((y1-y2)*(x3-x4) == (y3-y4)*(x1-x2))
    
    # 점 1-3 이은 직선 1개, 점 2-4 이은 직선 1개
    answer2 = ((y1-y3)*(x2-x4) == (y2-y4)*(x1-x3))
    
    # 점 1-4 이은 직선 1개, 점 2-3 이은 직선 1개
    answer3 = ((y1-y4)*(x2-x3) == (y2-y3)*(x1-x4))
    
    # 하나라도 평행하면 1 반환
    return 1 if answer1 or answer2 or answer3 else 0

나올 수 있는 직선의 조합의 기울기를 모두 구하여 평행인지 확인한다

  • 시간 복잡도 O(1)
  • 공간 복잡도 O(1)

 

 

3. 코딩테스트 대비 포인트

- inline assignment (expression assignment)

조건문의 결과를 변수에 직접 할당하는 것 (Python에서는 walrus operator(:=)를 사용해 구현)

# 일반적인 방법
value = some_function()
if value > 10:
    print(value)

# Inline Assignment
if (value := some_function()) > 10:
    print(value)

- 배열에서 원소를 삭제하는 방법

(1) 리스트 컴프리헨션 -> 조건에 충족하는 원소만 남도록

조건에 따라 필터링된 새 리스트를 생성

lst = [1, 2, 3, 4, 5]
filtered = [x for x in lst if x != 3]  # 3 제거
print(filtered)  # [1, 2, 4, 5]

 

(2) remove() -> 특정 값에 해당하는 원소 삭제

특정 값을 리스트에서 가장 먼저 나오는 하나의 값 제거 (값이 없으면 ValueError 발생)

lst = [1, 2, 3, 2, 4]
lst.remove(2)  # 가장 앞에 있는 2를 삭제
print(lst)  # [1, 3, 2, 4]

 

(3) pop() -> 특정 인덱스의 원소 삭제, 삭제된 값 반환

특정 인덱스의 값을 제거하고 반환 (기본 값은 마지막 원소 삭제, 인덱스가 없으면 IndexError 발생)

lst = [1, 2, 3, 4]
print(lst.pop())  # 4 (마지막 값을 반환 후 삭제)
print(lst)  # [1, 2, 3]

print(lst.pop(1))  # 2 (1번 인덱스를 삭제하고 반환)
print(lst)  # [1, 3]

 

(4) del -> 특정 인덱스 또는 슬라이스의 원소 삭제

특정 인덱스 또는 슬라이스(범위를 지정해 여러 값 삭제 가능)를 삭제 (인덱스가 없으면 IndexError 발생)

lst = [1, 2, 3, 4]
del lst[1]  # 1번 인덱스를 삭제
print(lst)  # [1, 3, 4]

del lst[1:3]  # 인덱스 1부터 2까지 삭제
print(lst)  # [1]

- List(리스트), Array(배열) 구분

(1) List

Python의 내장 자료형으로 한 리스트 안에 다양한 데이터 타입을 지원함

lst = [1, 2, "three", 4.0]

 

(2) Array

Array 모듈을 사용해 배열 생성 가능하고 동일한 데이터 타입만 저장 가능함

import array
arr = array.array('i', [1, 2, 3, 4])  # 'i'는 정수형

- Destructuring(비구조화 할당)

리스트나 딕셔너리 같은 복합 자료구조를 개별 변수로 분해하여 할당하는 방식

👉🏻 가독성을 높이고, 값을 간단히 추출할 수 있음

 

(1) 리스트 비구조화 할당

lst = [1, 2, 3]
a, b, c = lst
print(a, b, c)  # 1 2 3

 

(2) 딕셔너리 비구조화 할당

dct = {'name': 'Alice', 'age': 25}
name, age = dct['name'], dct['age']
print(name, age)  # Alice 25

- zip(*iterables)

iterable 객체를 병렬 처리하기 위해 사용됨

👉🏻 여러 iterable을 묶어 튜플의 iterator를 반환

  • *iterables : 병렬로 처리할 여러 iterable 객체(리스트, 튜플, 문자열 등)
  • 반환값 : 묶인 튜플의 iterator

 

ex1) 여러 iterable를 zip하는 경우

a = [1, 2, 3]
b = ['x', 'y', 'z']

result = zip(a, b)
print(list(result))  # [(1, 'x'), (2, 'y'), (3, 'z')]

 

cf) 가장 짧은 iterable에 맞춤

a = [1, 2, 3]
b = ['x', 'y']

result = zip(a, b)
print(list(result))  # [(1, 'x'), (2, 'y')]

 

ex2) zip(*)으로 iterable을 unzip

pairs = [(1, 'x'), (2, 'y'), (3, 'z')]
a, b = zip(*pairs)

print(a)  # (1, 2, 3)
print(b)  # ('x', 'y', 'z')

 

ex3) zip(*matrix)로 리스트를 전치(Transpose)

matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

transposed = list(zip(*matrix))
print(transposed)
# Output: [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

'PS' 카테고리의 다른 글

[프로그래머스] 완주하지 못한 선수 - Python3  (0) 2025.01.16
[프로그래머스] 옹알이 (1) - Python3  (1) 2024.12.27
[프로그래머스] 안전지대 - Python3 ⭐️  (0) 2024.12.13
[프로그래머스] 문자열 밀기 - Python3  (1) 2024.12.12
[프로그래머스] 종이 자르기 - Python3  (1) 2024.12.12
'PS' 카테고리의 다른 글
  • [프로그래머스] 완주하지 못한 선수 - Python3
  • [프로그래머스] 옹알이 (1) - Python3
  • [프로그래머스] 안전지대 - Python3 ⭐️
  • [프로그래머스] 문자열 밀기 - Python3
jooiss
jooiss
👩🏻‍💻
  • jooiss
    지금
    jooiss
  • 전체
    오늘
    어제
    • 분류 전체보기 (47)
      • CS (0)
      • PS (45)
      • Android (1)
      • DA & AI (1)
      • Projects (0)
      • Logs (0)
      • Etc. (0)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    deque
    이중반복문탈출
    replace
    sorted
    dp
    int
    sort
    re
    list
    remove
    Lambda
    Index
    동시할당
    sum
    get
    DICTIONARY
    dict
    List comprehension
    enumerate
    bin
    map
    정규표현식
    len(arr)==0
    메모리제이션
    set
    defaultdict
    isdigit
    unpacking
    find
    counter
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
jooiss
[프로그래머스] 평행 - Python3
상단으로

티스토리툴바