1. 문제 설명
주어진 네 개의 점을 두 개씩 이었을 때, 두 직선이 평행이 되는 경우가 있으면 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 |