Boj 25498) 핸들 뭘로 하지
문제
설명
실수하기 좋은 전략 중 하나가 바로 가장 사전순으로 뒤에 오는 자식만을 사용하는 것이다. 만약 두 노드가 같은 알파벳을 가리키면 그 자식까지 가야하고 결국엔 리프노드까지 가서 비교를 수행해야한다. 이 상황에서 string 비교 연산을 그대로 사용하면 시간복잡도가 O(\(\mathrm{N}^2\)) 이 되어서 TLE 가 난다.
이를 간단하게 해결하는 방법은 현재의 Depth 에 한정지어서 문자를 비교를 하고 이에 따라서 탐색을 이어할지 말지를 결정하는 것이다. 아래 코드는 DFS 지만 BFS 를 이용해서도 동일한 작업을 수행할 수 있다. 오히려 BFS 로 푸는 것이 더 직관적이고 더 빠르다.
이런 간단한 방법이 생각보다 생각해내기가 어렵고 실수하기도 좋아 까다로웠다.
시간 복잡도
O(\(\mathrm{N}\))
코드
string in, ans;
vector<int> line[500001];
void DFS(int cur, int parent, int depth = 0)
{
if (ans.size() == depth)
ans += in[cur];
else ans[depth] = in[cur];
for (auto l : line[cur])
{
if (l == parent) continue;
if (ans.size() == depth || ans[depth + 1] <= in[l])
{
if (ans[depth + 1] < in[l]) ans.resize(depth+1);
DFS(l, cur, depth + 1);
}
}
}
int main(void)
{
int n; cin >> n;
cin >> in;
for (int i = 0; i < n - 1; i++)
{
int a, b; cin >> a >> b;
a--, b--;
line[a].push_back(b);
line[b].push_back(a);
}
DFS(0, -1);
cout << ans;
}
댓글남기기