알고리즘 문제/BOJ
5397번 키로거
parkit
2019. 10. 21. 13:43
728x90
반응형
https://www.acmicpc.net/problem/5397
vector의 insert와 erase는 O(N^2)의 연산이기 때문에 시간 초과가 걸린다.
따라서, O(1)인 list를 활용한다.
'-'일 때, temp를 활용하는 이유는 erase를 할 때에는 하나 감소시켜 진행한다.
begin()은 첫 원소를 가리키지만,
end()는 마지막 원소의 다음 칸에 있는 빈 칸을 가리킨다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <bits/stdc++.h> using namespace std; int main(void) { //freopen("C:\\Users\\park7\\Desktop\\sample_input.txt", "r", stdin); cin.tie(NULL); list<int> List; List.push_back(1); auto itr = List.begin(); auto itr2 = List.end(); cout << (*itr) << '\n'; //cout << (*itr2) << '\n'; // 오류 발생 //List.erase(itr2); // 오류 발생 //List.erase(--itr2); // 이렇게 작성해야 한다. return 0; } | cs |
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 | #include <bits/stdc++.h> using namespace std; int main(void) { //freopen("C:\\Users\\park7\\Desktop\\sample_input.txt", "r", stdin); cin.tie(NULL); int test_case; scanf("%d", &test_case); while (test_case--) { string s; list<char> lc; int idx = 0; auto itr = lc.begin(); cin >> s; for (int i = 0; i < s.length(); i++) if (s[i] == '<') { if (itr == lc.begin()) continue; --itr; } else if (s[i] == '>') { if (itr == lc.end()) continue; ++itr; } else if (s[i] == '-') { auto temp = itr; if (itr != lc.begin()) { --temp; lc.erase(temp); } } else lc.insert(itr, s[i]); for (auto i : lc) printf("%c", i); printf("\n"); } return 0; } | cs |
728x90
반응형