일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 백준
- 시간초과
- 프로그래머스
- 카카오페이
- springboot
- 그리디
- FastAPI
- t-test
- linux
- Python
- 레디스
- 딥러닝
- lightsail
- LangChain
- 정보보안
- 리눅스
- 보안기사
- t검정
- synflooding
- 보안
- 다이나믹프로그래밍
- java
- 분산시스템
- 코딩테스트
- 자료구조
- 카카오페이면접후기
- 정보보안기사
- 우선순위큐
- 파이썬
- 데이터사이언스
Archives
Techbrad
[백준] 10775 공항 공항 - 파이썬 Union-find 본문
반응형
문제 접근 방법
가장 먼저 시도 했던 풀이 -> 시간초과
도킹 리스트를 O(N) 순회하고 다시 비어 있는 게이트를 찾기 위해 항상 이중 반복문이 되어 버려 시간 초과가 발생한 것 같다.
import sys
input = sys.stdin.readline
G = int(input())
D = int(input())
dock_p = [int(input()) for _ in range(1, D+1)] # 도킹 리스트
gates = (G + 1) * [0] # 실제 게이트수보다 +1
for p in dock_p:
if gates[0] == 1: # 0번째 게이트가 1이면 종료
break
else:
if gates[p] == 0: # 게이트가 비어있으면
gates[p] = 1 # 도킹
else: # 게이트가 비어있지 않다면
while True: # 순회를 돈다.
if gates[p-1] == 0: # -1의 게이트가 비어 있으면
gates[p-1] = 1 # -1 게이트에 도킹
break
else: # 차있다면
p = p-1
continue # -2 도킹 순회를 시작한다.
print(sum(gates[1:]))
최종 제출코드
Union-find라는 알고리즘을 인터넷에 찾아볼 수 있었다. 재귀를 통해 O(1)으로 시간 단축을 할 수 있도록 경로 단축이 되었다. 해당 과정은 https://gaza-anywhere-coding.tistory.com/69 블로그를 참고했다.
import sys
input = sys.stdin.readline
G = int(input())
D = int(input())
dock_p = [int(input()) for _ in range(1, D+1)]
parent = {i:i for i in range(G+1)}
def parent_find(x):
if x == parent[x]:
return x
p = parent_find(parent[x])
parent[x] = p
return parent[x]
def union(x, y):
x = parent_find(x)
y = parent_find(y)
parent[x] = y
cnt = 0
for i in dock_p:
x = parent_find(i)
if x == 0:
break
union(x, x-1)
cnt +=1
print(cnt)
반응형
'Programming > 코딩테스트' 카테고리의 다른 글
[백준] 1157번 단어 공부 - 파이썬 (0) | 2024.02.02 |
---|---|
[백준] 1946번 신입 사원 - 파이썬 (2) | 2023.11.14 |
[백준] 1202번 보석도둑 - 우선순위큐 파이썬 (0) | 2023.09.25 |
[백준] 16953번 A → B - 그리디알고리즘 파이썬 (0) | 2023.09.12 |
[백준] 13305번 주유소 - 그리디알고리즘 파이썬 (0) | 2023.09.10 |