inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

3-L 질문 있습니다.

해결된 질문

175

찬비

작성한 질문수 18

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;
}

C++ 코테 준비 같이 해요!

답변 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장에서 배웁니다.) 보통은 "배열"로 접근하려고 생각하되 문제를 보시고 어떤 자료구조를 사용해야 할지 생각해야합니다. 

 

또 질문사항있으시면 언제든 말씀 부탁드립니다. 

감사합니다. 

강사 큰돌 올림. 

1-E질문입니다!

0

529

2

3-L 틀린 부분 피드백 부탁드립니다.

0

833

2

1-A문제 순열재귀함수 질문입니다.

0

396

1

1-A 일곱난쟁이문제입니다

0

466

1

문제 풀 때 방향성에 대해

0

808

1

맥에서 vs code로 실행 관련 질문입니다

0

528

1

17071번 메모리 초과

0

389

1

1-C질문입니다!

0

427

2

2-B BFS 시간초과질문

0

636

2

1-O 13번 라인

0

445

1

6-J 놀이공원 문제 질문

0

387

1

구현관련 질문

0

487

1

강의 교안

0

321

1

실력을 더 올리고나서 강의를 보는 것이 맞을까요?

0

549

1

안녕하세요! 재귀함수에 관해서 질문드립니다

0

538

1

1-K

0

481

2

3-G번 질문있습니다.

1

478

3

3-C 실행 시간 질문드립니다.

0

500

1

4-A 문제 풀이 질문있습니다.

0

598

2

비트마스킹 연산자 "1의 보수" 영문 표기법

0

441

1

격자탐색 문제에서 BFS 시간복잡도 질문드립니다.

0

345

1

3-O go 함수 질문 드립니다.

1

450

2

4-A 출력 질문

0

306

1

1주차 1-O 질문드립니다

0

262

1