Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- ODQA
- 파이썬 3
- 정렬
- 최단경로
- 그리디
- 프로그래머스
- 백트랙킹
- dfs
- 개인회고
- 구현
- U_stage
- 이진탐색
- mrc
- python3
- 기술면접
- Level2
- 알고리즘_스터디
- Level2_PStage
- Level1
- 단계별문제풀이
- 그래프이론
- 부스트캠프_AITech_3기
- 글또
- 알고리즘스터디
- 이코테
- 다시보기
- dp
- 부스트캠프_AITech3기
- 백준
- 주간회고
Archives
- Today
- Total
국문과 유목민
[그래프이론] 탑승구 본문
"이것이 코딩테스트다(나동빈 저)"에서 나온 문제에 대한 코드를 다루고 있습니다.
문제에 대한 구체적인 설명과 조건 등은 책을 참고해주시기 바랍니다.
소요시간: 20분
1. 문제 설명
- 비행기는 도킹할 수 있는 탑승구가 정해져 있다. 하지만 탑승구에 도킹해있는 비행기가 있으면 다른 비행기는 도킹할 수 없다. 탑승구에 더 이상 도킹이 불가능할 때까지 비행기를 받고자 할 때, 최대로 받을 수 있는 비행기는 몇 대인가?
2. 접근 방식
- 서로소 집합 알고리즘을 활용해서 문제를 풀 수 있다.
- 0번째 집합(parent[0])까지 만든다. 집합을 주어진 순서대로 앞선 원소와 묶어가다가 0번째 집합에 묶이면 반복을 종료한다.
3. 코드
def find_parent(parent, a):
if parent[a] != a:
parent[a] = find_parent(parent, parent[a])
return parent[a]
def union_parent(parent, a, b):
a = find_parent(parent, a)
b = find_parent(parent, b)
if a < b:
parent[b] = a
else:
parent[a] = b
parent = [0] * (a+1)
for i in range(1, a+1):
parent[i] = i
result = 0
### 핵심코드, 게이트는 주어진 수 중 최대한 큰 수에 넣으면서 루트노드를 하나씩 내린다.
for gate in planes:
data = find_parent(parent, gate)
if data == 0:
break
else:
union_parent(parent,data, data-1)
result+=1
print(result)
4. 코멘트
- 어떤 것을 노드로 둬야 할까에 대해 고민을 좀 오래했었던 것 같다.
- 비용에 관계없이 순서대로 처리하는 문제였는데, 그걸 모르고 여러가지를 생각하다가 또 틀렸었던 것 같다.
- 서로소집합은 서로소 집합을 구현하는데 어렵지는 않지만, 알고리즘을 이해하는데 어려운 것 같다. '집합을 어떻게 묶고, 이 묶은 것을 어떤 것으로 해석할 것인가' 등에 대한 다양한 경험이 있어야 한다. 약간 그래프 이론 문제를 풀다가 정답을 보게 되면, 바로 옆에 아는 사람이 있었는데 모르고 있었던 것 같은 느낌이 든다.
'알고리즘_코딩테스트 > 이것이 코딩테스트다' 카테고리의 다른 글
[그래프 이론] 최종순위 (0) | 2021.12.28 |
---|---|
[그래프이론] 여행계획 (0) | 2021.12.27 |
[그래프이론] 어두운 길 (0) | 2021.12.27 |
[최단경로] 숨바꼭질 (0) | 2021.12.24 |
[최단경로] 화성탐사 (0) | 2021.12.23 |