이유는 알 수 없지만 진법 변환하는 쉬운 문제임에도 정답율이 매우 낮다.
통계를 보니 시간초과로 틀린 분들이 많은 걸 알 수있었다.
그 말은 즉 통상적인 방법인,
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을 하는 것보다 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 |