[백준] 1949번: 우수 마을 - 파이썬
2023. 1. 7. 23:23ㆍ백준 & 프로그래머스
문제 보기
https://www.acmicpc.net/problem/1949
1949번: 우수 마을
N개의 마을로 이루어진 나라가 있다. 편의상 마을에는 1부터 N까지 번호가 붙어 있다고 하자. 이 나라는 트리(Tree) 구조로 이루어져 있다. 즉 마을과 마을 사이를 직접 잇는 N-1개의 길이 있으며,
www.acmicpc.net
풀이 및 코드
필자는 dfs, bfs를 통한 탐색을 할 때 재귀 깊이 에러 때문에 재귀함수보다는 deque를 이용해 문제를 해결하고자 했다. 근데 오늘 이 문제는 재귀를 이용한 방법이 가장 맞는 듯했다. 하지만 n의 범위가 10000이기에 재귀에러가 발생할 수밖에 없었다.
sys.setrecursionlimit(10 ** 5)
사실 이 메서드를 모르는 것은 아니었지만, 코테 공부를 처음 시작할 무렵 재귀깊이를 건드리면 안 된다고 생각해 거들떠보지도 않았다. 그런데 구글링에 검색해보니 코테 꿀팁 중에 하나가 해당 메서드라고 한다... 파이썬은 재귀깊이가 비교적 얕아 해당 메서드를 이용해 깊이를 늘려주어야 재귀와 관련된 문제를 풀 수 있다고 한다. 이제라도 알았으니 참 다행이다!
푸는 방식은 dfs와 dp를 이용해 풀었다.
- dfs로는 연결된 마을들을 돌면서, 해당 마을이 우수 마을일 경우, 아닐 경우를 나누어 각각 dp에 저장했다.
- dp는 dp[마을 번호][우수 마을 여부] 형태로 구성했다.
- 만일 이전의 마을이 우수 마을이었다면 다음 마을은 무조건 우수 마을이 아니다.
- 만일 이전의 마을이 우수 마을이 아니라면 해당 마을은 우수 마을과 비 우수 마을 모두 가능하다. (문제에서는 우수마을이 아닌 경우 우수마을이 인접해야 한다고 하였지만 우수x - 우수x - 우수x 가 된다면 총합이 최대가 될 수 없기에 결과적으론 무관하다)
'백준 & 프로그래머스' 카테고리의 다른 글
[백준] 2306: 유전자 - 파이썬 (0) | 2023.01.09 |
---|---|
[백준] 1947번: 선물 전달 - python (0) | 2023.01.08 |
[백준] 1520번: 내리막 길 - 파이썬 (0) | 2023.01.05 |
[백준] 2302번: 극장 좌석 - 파이썬 (0) | 2023.01.05 |
[백준] 16236번: 아기 상어 - 파이썬 (2) | 2023.01.04 |