2진수를 8진수로 바꾸어서 푸는 문제 은근 코드가 손이가고 메모리도 크고 시간도 많이잡아먹었다.. 내 연산이 좀 비효율적이었나.. 데이터 크기는 최대 1,000,000개의 1과 0으로 이루어진 2진수이다. 문제를 볼 때 빨리 풀고 싶어서 시간복잡도를 계산안하고 무식하게 푸는 방법을 많이 썼는데 시간복잡도를 항상 풀기 이전의 계산하는게 중요하다고 했다.. 그래야 코딩을 할 지 안 할지 결정할 수 있기 때문이다. 이중 for 문도 없고 push back pop back, back 같이 아직 stl을 깊게 탐구하지 않았지만 그렇게 시간복잡도를 증가시키는 연산이 없는 거 같아서 예상 시간복잡도는 O(n)이다.
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 | #include <iostream> #include <string> #include <vector> using namespace std; int main() { string two_byte; cin >> two_byte; int size = two_byte.size(); if (size % 3 == 1) { if (two_byte.front() == '0') { cout << 0 << endl; return 0; } cout << int(two_byte.front() - '0'); two_byte.erase(0, 1); } if (size % 3 == 2) { int first = int(two_byte.front() - '0'); two_byte.erase(0, 1); int second = int(two_byte.front() - '0'); two_byte.erase(0, 1); cout << first * 2 + second * 1; } size = two_byte.size()/3; vector<int> reverse_num; for (int i = 0; i < size; ++i) { int third = int(two_byte.back() - '0'); two_byte.pop_back(); int second = int(two_byte.back() - '0'); two_byte.pop_back(); int first = int(two_byte.back() - '0'); two_byte.pop_back(); int data = first * 4 + second * 2 + third * 1; reverse_num.push_back(data); } size = reverse_num.size(); for (int i = 0; i < size; ++i) { cout << reverse_num.back(); reverse_num.pop_back(); } return 0; } | cs |
'백준 온라인 저지' 카테고리의 다른 글
백준 1929: 소수구하기(충격의 endl) (0) | 2018.07.13 |
---|---|
백준 1978: 소수 찾기 (0) | 2018.07.13 |
백준 11005: 진법변환2 (0) | 2018.07.13 |
백준 2225: 합분해 (0) | 2018.07.10 |
백준 2133: 타일 채우기 (0) | 2018.07.10 |