이유는 알 수 없지만 진법 변환하는 쉬운 문제임에도 정답율이 매우 낮다.

통계를 보니 시간초과로 틀린 분들이 많은 걸 알 수있었다.

 

그 말은 즉 통상적인 방법인,

1. 나눈다.

2. 나머지를 모은다.

3. 뒤집는다.

로는 어려울 수 있다는 뜻이다.

 

그래서 조금 다르게 풀었다.

8진수를 2진수로 각 자리를 변환하면 0~7까지 000, 001, 010, 011, 100, 101, 111로 표현 할 수 있다.

 

저걸 배열에 저장해서 입력된 문자열의 각 자리를 그대로 인덱스로 사용해서 꺼내오면 된다.

 

유사 코드로 작성하면, 다음과 같다.

=========================

oct2bin[] = {000, 001, 010, 011, 100, 101, 111}

cin>>oct

 

// 앞자리는 1로만 시작해야함

if oct[0] ==3 or 2 then print(oct2bin[oct[0]-'0'][1]) print(oct2bin[oct[0]-'0'][2])

if oct[1] == 1 then print(oct2bin[oct[0]-'0'][2])

 

loop : oct i 1->len

start

print(oct2bin[oct[i]-'0'])

end

print("\n")

=========================

 

단, C++기준으로 매번 cout을 하면 퍼포먼스가 떨어지므로 stringstream에 모아서 나중에 한번에 출력한다.

cout 매번 하기 vs stringstream으로 한번에 하기

두 가지 모두 해봤는데, 매번 cout을 하는 것보다 stringstream으로 한번에 출력하는 것은 메모리를 1.5배정도 더 썼다.

하지만 속도는 1/1.5 배였다.

 

끝으로 문제에 함정 카드가 하나 있긴한데, 그건 소스코드 보시면서 확인해보시거나, 직접 한번 생각 해보시는 것도 좋을 것 같다.

그것 때매 한번 틀리고 고민좀 했었다.

 

 
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
#include <iostream>
#include <string>
#include <sstream>
 
using namespace std;
 
int main(int argc, char *argv[])
{
    string oct = "";
    stringstream bin;
    char oct2bin[8][4= {"000""001","010","011","100","101","110","111"};
 
    cin>>oct;
    if (oct == "0")
    {
        cout<<"0\n";
        return 0;
    }
    
    
    if ((oct[0]-'0' == 3)  || (oct[0]-'0' == 2))
        bin<<oct2bin[oct[0]-'0'][1]<<oct2bin[oct[0]-'0'][2];
    else if (oct[0]-'0' == 1)
        bin<<oct2bin[oct[0]-'0'][2];
    else
        bin<<oct2bin[oct[0]-'0'];
    
    for (int i=1; i<oct.length(); i++)
    {
        bin<<oct2bin[oct[i]-'0'];
    }
    
    cout<<bin.str()<<"\n";
    
    return 0;
}
 
cs

'컴퓨터과학 > 알고리즘 문제풀기' 카테고리의 다른 글

16235번 : 나무 재테크  (0) 2019.10.17
7576번 : 토마토  (0) 2019.07.15
9012번 : 괄호  (0) 2019.07.15
STL을 이용한 자료구조  (0) 2019.07.15
문제풀이 계획  (0) 2019.07.15

+ Recent posts