본문 바로가기

알고리즘/BOJ

1373번

1373번 - 2진법을 8진법으로 


이 문제는 푸는데 시간초과가 자꾸 나서 질문 게시판에 글을 올렸었다.



한 고수분께서 친절하게 답변해주셨다.. substr 이란 놈이 시간을 엄청 잡아먹는거였다..


앞으로 조심해서 사용해야겠다.. 그래서 결국 substr 을 쓰지 않고 size란 변수를 만들어서 증가시켜주니까 AC를 받았다.


< 정답 코드 >


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
#include<iostream>
#include<string>
#include<math.h>
 
using namespace std;
 
int main()
{
    string s;
    getline(cin, s);
    int size = 0;
 
    while (s.size()>size)
    {
        int check=(s.size()-size) % 3;
        int tmp1 = s[size- '0';
        int tmp2 = s[size + 1- '0';
        int tmp3 = s[size + 2- '0';
        int ans = 0;
 
        if (check == 0)
        {
            ans = tmp1 * 4 + tmp2 * 2 + tmp3;
 
            printf("%d", ans);
            size += 3;
        }
        else if (check == 1)
        {
            ans = tmp1;
 
            printf("%d", ans);
            size += 1;
        }
        else if (check == 2)
        {
            ans = tmp1 * 2 + tmp2;
 
            printf("%d", ans);
            size += 2;
        }
    }
    printf("\n");
 
 
    return 0;
}
cs



< 처음에는 2진법을 10진법으로 바꾼뒤 8진법으로 변환 : 시간 초과 >


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
#include<iostream>
#include<string>
#include<math.h>
#include<stack>
using namespace std;
 
int main()
{
    string s;
    cin >> s;
 
    int size = s.size();
    long long num = 0;
    while (!s.empty())
    {
        char tmp = s.front();
 
        num += (tmp - '0')*pow(2size - 1);
 
        size -= 1;
        s=s.substr(1);
    }
 
    stack<int> st;
 
    while (num != 0)
    {
        st.push(num % 8);
        num /= 8;
    }
 
    while (!st.empty())
    {
        cout << st.top();
        st.pop();
    }
    cout << endl;
 
    return 0;
}
cs


< 2진법을 3개씩 끊어서 8진법으로 표현 : 시간초과 >

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<math.h>
#include<queue>
 
using namespace std;
 
int main()
{
    string s;
    queue<int> q;
    getline(cin, s);
 
    while (!s.empty())
    {
        int size = s.size();
        int tmp1 = s[0- '0';
        int tmp2 = s[1- '0';
        int tmp3 = s[2- '0';
        int ans = 0;
 
        if (size % 3 == 0)
        {
            ans = tmp1*4 + tmp2*2 + tmp3;
 
            printf("%d", ans);
            s = s.substr(3);
        }
        else if (size % 3 == 1)
        {
            ans = tmp1;
 
            printf("%d", ans);
            s = s.substr(1);
        }
        else if (size % 3 == 2)
        {
            ans = tmp1*2 + tmp2;
 
            printf("%d", ans);
            s = s.substr(2);
        }
    }
    printf("\n");
 
 
    return 0;
}
cs


반응형

'알고리즘 > BOJ' 카테고리의 다른 글

2252번  (0) 2017.12.05
11723번  (0) 2017.12.05
2745번  (0) 2017.12.04
11005번  (0) 2017.12.02
9613번  (0) 2017.12.02