BOJ 21606 아침 산책
난이도 : (크래프톤 정글 기준) 중, (백준 난이도 기준) 골3
사용 알고리즘 or 자료 구조 : DFS / BFS



처음 생각한 풀이
단순히 node와 edge가 tree형태로 주어지니까 당연히 실내 전체 순회를 돌며 실내에서 시작해서 다음 노드가 실외라면 dfs를 한번 더 실행하고 실내라면 dfs를 마치고 답을 +1 시켜주는 것으로 생각하고 풀었더니 서브 태스크의 제한조건을 모두 만족하지 못하고 시간초과가 떠버렸다.
시간 초과가 뜨는게 당연한 게 2번 같은 경우에는 edge가 상당히 많아 dfs를 굉장히 많이 호출하여 시간 초과가 안나도 메모리 초과가 뜰 것인게 당연하고, 5번의 경우에도 마찬가지일 것이다.
그럼 이걸 어떻게 풀어야할까? 생각해봤지만 도무지 떠오를것 같지 않아 구글에서 접근법 만을 찾아봤다.
구글링 이후 풀이
접근법 자체는 굉장히 단순했다.
실내를 기준으로 순회를 돌지말고 실외를 기준으로 순회를 돌면 되는 것이었다.
무슨 소리냐 하면 실외 노드를 기준으로 순회를 돌며 해당 실외 그룹과 연결된 실내 노드의 개수를 세기만 하면 되는 것이다.
그렇게 되면 우리는 어차피 실내 => (임의의 경로) => 시작과 다른 실내 로 가는 경로의 개수를 세면 되는 것이므로 서로 다른 실내 노드를 순서 상관없이 두 개 고르는 경우의 수만 세주면 되는 것이다.

이 그림과 같은 경우에는 실외 그룹과 연결된 실내 노드의 개수가 14개 이므로 이 경우 아침 산책 경로의 개수는 14 * 13 = 182가 된다.
여기서 조심해야되는 것은 다음 그림들 같은 경우이다.

실외 그룹이 2개 이상으로 나누어지는 경우.
이 경우는 순회를 잘 돌며 각 실외 그룹에서의 산책 경로 개수를 각각 구해서 더해주기만 하면 된다.

이 경우도 가능하므로 정답에 잘 포함시켜보도록 하자.
참고로 이 경우는 왼쪽 실내 => 오른쪽 실내, 오른쪽 실내 => 왼쪽 실내 로 두가지 경우의 수가 나온다.
이런 방식을 잘 구현하면 아침 산책은 만점을 받고 해결할 수 있다.
(참고로 dfs, bfs 방식 둘 다 구현 가능하니 편한 쪽으로 구현하도록 하자.)
※ 스 포 주 의 ※
코드
'알고리즘' 카테고리의 다른 글
[알고리즘] 크래프톤 정글 2주차 / 알고리즘 中 혼자서 못 푼 문제 정리6(장난감 조립) (1) | 2024.04.01 |
---|---|
[알고리즘] 크래프톤 정글 2주차 / 알고리즘 中 혼자서 못 푼 문제 정리5(미로만들기) (1) | 2024.04.01 |
[알고리즘] 크래프톤 정글 1주차 / 알고리즘 中 혼자서 못 푼 문제 정리3(철로) (1) | 2024.03.27 |
[알고리즘] 크래프톤 정글 1주차 / 알고리즘 中 혼자서 못 푼 문제 정리2(가운데를 말해요) (0) | 2024.03.27 |
[알고리즘] 크래프톤 정글 1주차 / 알고리즘 中 혼자서 못 푼 문제 정리1(괄호의 값) (0) | 2024.03.27 |