import sys input = sys.stdin.readline G = int(input()) P = int(input()) result = 0 plane = [int(input()) for _ in range(P)] parents_number = [i for i in range(G+1)] visited = [False]*(G+1) cur_idx = 0 planing = True while cur_idx<P and planing: cur_plane_number = plane[cur_idx] check = [cur_plane_number] while visited[cur_plane_number] and cur_plane_number>0: cur_plane_number = parents_number[cur_plane_number] check.append(cur_plane_number) if cur_plane_number == 0: break else: visited[cur_plane_number] = True for num in check: parents_number[num] = cur_plane_number-1 cur_idx += 1 print(cur_idx)
이 문제는 프로그래머스의 호텔 방 배정하기하고 동일한 문제라고 볼수 있다.
주어진 위치가 있고, 1~위치 사이에 비행기를 도킹할 수 없으면, 멈추면 되는것이다.
호텔 방 배정하기하고 동일하게, 자신의 다음 도킹 위치를 저장시켜놓으면 된다.
그러면서 최악의 경우를 방지하기 위해, 그 다음 도킹위치를 새로 갱신해주는 작업을 해주면 된다.
import sys input = sys.stdin.readline def find_parent(idx): if idx == make_set[idx]: return idx else: make_set[idx] = find_parent(make_set[idx]) return make_set[idx] G = int(input()) P = int(input()) make_set = [i for i in range(G+1)] result = 0 for k in range(P): plane_num = int(input()) gate_num = find_parent(plane_num) if gate_num < 1: break else: make_set[gate_num] = make_set[gate_num-1] result += 1 print(result)
이거는 좀 더 함수로 만들어놓은 것이다.
위와 똑같은 로직이지만, find_parent 라는 재귀함수를 통해, 자동적으로 갱신이 되게 해주었다.
호텔 방 배정하기 문제를 수월하게 풀었으면 이 문제도 수월하게 풀 수 있을거라 생각한다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 2268 수들의 합 (0) | 2021.05.27 |
---|---|
[BOJ/백준] 1368 물대기 (0) | 2021.05.23 |
[BOJ/백준] 11779 최소 비용 구하기 2 (0) | 2021.05.19 |
[BOJ/백준] 2239 스도쿠 (0) | 2021.05.19 |
[BOJ/백준] 1874 스택 수열 (0) | 2021.05.19 |