문제링크 : https://www.acmicpc.net/problem/14226
문제 접근
- BFS로 해서, 각 시간별 작업을 큐에 넣고 하면 되지 않을까
- 큐 : 화면, 클립보드
- 화면, 클립보드 중복 체크
- 그래서 S개를 만드는데 시간 최소를 구하면 되지
시간복잡도 계산
- BFS 시간복잡도 O(V+E) : 4e6
- 노드 : 화면 * 클립보드 1e6
- 간선: 3개 * 노드
- O(V+E) : 4e6
인트 계산
- S는 1000개 이하, 시간도 그보다 이하
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | #include <iostream> #include <queue> #include <map> using namespace std; // 스티커가 1000개 이상으로갔다가 떨어질 수도 있음 // 범위를 정하기가 애매해서 map으로 정의 map<pair<int, int>, bool> chk; int main() { int S; cin >> S; queue<pair<int, int>> q; q.push(make_pair(1,0)); chk[make_pair(1,0)] = 1; int t=0; while(!q.empty()) { int qsize =q.size(); while(qsize--) { auto eq = q.front(); q.pop(); int sc = eq.first; int cl = eq.second; if(sc == S) { cout << t << '\n'; return 0; } // 클립보드에 복사 if(chk[make_pair(sc,sc)] == 0) { q.push(make_pair(sc, sc)); chk[make_pair(sc,sc)] = 1; } // 클립보드에서 붙여쓰기 if(chk[make_pair(sc+cl,cl)] == 0) { q.push(make_pair(sc+cl, cl)); chk[make_pair(sc+cl,cl)] = 1; } // 하나 제거 if(sc>0) { if(chk[make_pair(sc-1,cl)] == 0) { q.push(make_pair(sc-1, cl)); chk[make_pair(sc-1,cl)] = 1; } } } t++; } return 0; } | cs |
문제유형
- 최소시간 구하는 BFS
'알고리즘 > 백준' 카테고리의 다른 글
백준 2252 줄 세우기 쉬운 풀이(C++/CPP) (0) | 2021.02.07 |
---|---|
백준 2805 나무 자르기 쉬운 풀이(C++/CPP) (0) | 2021.02.07 |
백준 1744 수 묶기 쉬운 풀이(C++/CPP) (0) | 2021.02.06 |
백준 1963 소수 경로 (0) | 2021.02.06 |
백준 1309 동물원 쉬운 풀이(C++/CPP) (0) | 2021.02.06 |