인프런 커뮤니티 질문&답변
3-L 질문 있습니다.
해결된 질문
작성
·
168
0
처음에 방문 처리를 map 자료형으로 처리했더니 1600ms가 나와서
강의를 보고 풀이를 봤습니다. 풀이는 map을 배열로만 바꿨을 뿐 다른점이 없어보였는데 400ms가 나오더군요.
보니까 map은 찾는 시간이 O(log n)이라서 오래 걸린다 생각하여 O(1)에 해당하는 unordered_map으로 바꿔보니 시간 초과가 났습니다.. 이런 유형은 그냥 map 쓰지말고 배열로 처리하는 게 나을까요?
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
void fastIO() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
}
int n, m;
string graph[22];
unordered_map<char, bool> visited;
int dx[4] = { -1, 0, 1, 0 };
int dy[4] = { 0, 1, 0, -1 };
int ans;
void DFS(int x, int y, int depth) {
ans = max(ans, depth);
for (int dir = 0; dir < 4; dir++) {
int nx = x + dx[dir];
int ny = y + dy[dir];
if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
if (visited[graph[nx][ny]]) continue;
visited[graph[nx][ny]] = 1;
DFS(nx, ny, depth + 1);
visited[graph[nx][ny]] = 0;
}
}
int main() {
fastIO();
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> graph[i];
}
visited[graph[0][0]] = 1;
DFS(0, 0, 1);
cout << ans << endl;
return EXIT_SUCCESS;
}답변 1
1
큰돌
지식공유자
안녕하세요. 찬비님ㅎㅎ
O(1)에 해당하는 unordered_map
>> 평균적으로는 그렇지만 최악의 경우 O(N)입니다. 참고로 저는 거의 쓰지 않습니다.
참고표입니다.
Difference :
| map | unordered_map
---------------------------------------------------------
Ordering | increasing order | no ordering
| (by default) |
Implementation | Self balancing BST | Hash Table
| like Red-Black Tree |
search time | log(n) | O(1) -> Average
| | O(n) -> Worst Case
Insertion time | log(n) + Rebalance | Same as search
Deletion time | log(n) + Rebalance | Same as search
이런 유형은 그냥 map 쓰지말고 배열로 처리하는 게 나을까요?
>> 유형마다 어떤 자료구조를 사용할지에 대한 "평균적"인 것은 없습니다. 이 문제의 경우 알파벳이라는 것을 방문했냐 안방문했냐라는 것을 처리하는 것이기 때문에 해당 "문자"에 대한 true혹은 false가 필요합니다. 또한 인덱스가 0 ~ 26사이를 가지죠. 이 경우 가장 빠른 것은 배열입니다. 비트마스킹으로도 풀 수 있구요. (4장에서 배웁니다.) 보통은 "배열"로 접근하려고 생각하되 문제를 보시고 어떤 자료구조를 사용해야 할지 생각해야합니다.
또 질문사항있으시면 언제든 말씀 부탁드립니다.
감사합니다.
강사 큰돌 올림.





