```
백준 1212번, 1373번, 8진수 2진수로 변환, 2진수 8진수로 변환 C++로 구현해보기
```

이번 글을 통해 배워갈 내용
- 백준 1212번, 백준 1373번 C++ 풀이
- 8진수를 2진수로 변환
- 2진수를 8진수로 변환
https://www.acmicpc.net/problem/1212
1212번: 8진수 2진수
첫째 줄에 8진수가 주어진다. 주어지는 수의 길이는 333,334을 넘지 않는다.
www.acmicpc.net
https://www.acmicpc.net/problem/1373
1373번: 2진수 8진수
첫째 줄에 2진수가 주어진다. 주어지는 수의 길이는 1,000,000을 넘지 않는다.
www.acmicpc.net
백준 1212번과 1373번은 난이도 쉬움 문제로서
매우 큰 이진수를 8진수로
8진수를 2진수로 변환해주는 문제들입니다.
30분 정도 위에 링크를 방문하셔서 풀어보시고
안풀리시는 경우에만 아래 해답을 봐주시면 감사하겠습니다.
일단 백준 1212번의 경우 333,334의 자리수를 넘지 않는 8진수를 2진수로 변환합니다.
0인 경우에는 0을 반환
0이 아닌 경우에는
switch (ch)
{
case '0':
{
tempString = "000";
break;
}
case '1':
{
tempString = "001";
break;
}
case '2':
{
tempString = "010";
break;
}
case '3':
{
tempString = "011";
break;
}
case '4':
{
tempString = "100";
break;
}
case '5':
{
tempString = "101";
break;
}
case '6':
{
tempString = "110";
break;
}
case '7':
{
tempString = "111";
break;
}
default:
{
break;
}
}
8진수에 대응하는 2진수로 만들어서 출력하고자 하는 8진수 스트링에 더해주었습니다.
stoi로 직접 변환을 하면 시간초과가 나기 때문에 효율화를 위해서 케이스 문을 썼습니다.
첫째자리의 경우 0이 오면 안되기 떄문에
첫째와 둘째 자리에 0이 오면 삭제해주었고
전체 코드는 다음과 같습니다.
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <stack>
using namespace std;
class COctalToBinary
{
private:
string octalNumberStr;
string binaryNumberStr;
public:
COctalToBinary()
{
}
~COctalToBinary()
{
}
void input()
{
// 입력 속도를 줄여서 시간제한을 통과하기 위해서 stringstream 사용
std::getline(cin, octalNumberStr);
}
void ConvertOctalToBinary()
{
binaryNumberStr = "";
string tempOctalNumberStr = octalNumberStr;
// 0인 경우
if (tempOctalNumberStr[0] == '0')
{
binaryNumberStr = '0';
}
else
{
for (char ch : tempOctalNumberStr)
{
string tempString;
switch (ch)
{
case '0':
{
tempString = "000";
break;
}
case '1':
{
tempString = "001";
break;
}
case '2':
{
tempString = "010";
break;
}
case '3':
{
tempString = "011";
break;
}
case '4':
{
tempString = "100";
break;
}
case '5':
{
tempString = "101";
break;
}
case '6':
{
tempString = "110";
break;
}
case '7':
{
tempString = "111";
break;
}
default:
{
break;
}
}
binaryNumberStr += tempString;
}
if (binaryNumberStr[0] == '0')
{
if (binaryNumberStr[1] == '0')
{
binaryNumberStr.erase(0, 2);
}
else
{
binaryNumberStr.erase(0, 1);
}
}
}
}
void output()
{
std::cout << binaryNumberStr;
}
void setOctal(int i)
{
octalNumberStr = to_string(i);
}
};
int main()
{
COctalToBinary* cOctalToBinary = new COctalToBinary();
// 값을 입력받는다.
cOctalToBinary->input();
// 값을 변환한다.
cOctalToBinary->ConvertOctalToBinary();
// 결과를 출력한다
cOctalToBinary->output();
//for (int i = 0; i < 50; i++)
//{
// if ((i % 10 < 8))
// {
// cOctalToBinary->setOctal(i);
// // 값을 변환한다.
// cOctalToBinary->ConvertOctalToBinary();
// // 결과를 출력한다
// cOctalToBinary->output();
// cout << endl;
// }
//}
return 0;
}
백준 1373번의 경우 위와 동일하게 풀려고 하였으나 시간 초과 때문에
더욱더 시간 복잡도가 적은 방식을 찾아서 구했습니다.
void ConvertBinaryToOctal()
{
string tempBinaryNumberStr = binaryNumberStr;
int tempVal;
octalNumberStr = "";
const int sizeOfBinaryNumberStr = tempBinaryNumberStr.size();
if (sizeOfBinaryNumberStr % 3 == 1)
{
tempVal = tempBinaryNumberStr[0] - '0';
octalNumberStr += std::to_string(tempVal);
}
else if (sizeOfBinaryNumberStr % 3 == 2)
{
tempVal = (tempBinaryNumberStr[0] - '0') * 2 + (tempBinaryNumberStr[1] - '0');
octalNumberStr += std::to_string(tempVal);
}
for (int i = sizeOfBinaryNumberStr % 3; i < sizeOfBinaryNumberStr; i += 3)
{
tempVal = (tempBinaryNumberStr[i] - '0') * 4 + (tempBinaryNumberStr[i+1] - '0') * 2 + (tempBinaryNumberStr[i+2] - '0');
octalNumberStr += std::to_string(tempVal);
}
}
2진수의 자릿수를 구해서
3으로 모듈러 하고
1이면 한자리수 0과 1을 8진수로 변환
2이면 두자리수 10,11을 8진수로 변환
그리고 나머지 자리들을 8진수로 변환해서
스트링에 더해주었습니다.
전체코드는 다음과 같습니다.
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <stack>
// https://www.acmicpc.net/problem/1212
// https://www.acmicpc.net/problem/1373
using namespace std;
class COctalBinaryConvertor
{
private:
string octalNumberStr;
string binaryNumberStr;
public:
COctalBinaryConvertor()
{
}
~COctalBinaryConvertor()
{
}
void inputOctal()
{
// 입력 속도를 줄여서 시간제한을 통과하기 위해서 stringstream 사용
std::getline(cin, octalNumberStr);
}
void inputBinary()
{
// 입력 속도를 줄여서 시간제한을 통과하기 위해서 stringstream 사용
std::getline(cin, binaryNumberStr);
}
void ConvertOctalToBinary()
{
binaryNumberStr = "";
string tempOctalNumberStr = octalNumberStr;
// 0인 경우
if (tempOctalNumberStr[0] == '0')
{
binaryNumberStr = '0';
}
else
{
for (char ch : tempOctalNumberStr)
{
string tempString;
switch (ch)
{
case '0':
{
tempString = "000";
break;
}
case '1':
{
tempString = "001";
break;
}
case '2':
{
tempString = "010";
break;
}
case '3':
{
tempString = "011";
break;
}
case '4':
{
tempString = "100";
break;
}
case '5':
{
tempString = "101";
break;
}
case '6':
{
tempString = "110";
break;
}
case '7':
{
tempString = "111";
break;
}
default:
{
break;
}
}
binaryNumberStr += tempString;
}
if (binaryNumberStr[0] == '0')
{
if (binaryNumberStr[1] == '0')
{
binaryNumberStr.erase(0, 2);
}
else
{
binaryNumberStr.erase(0, 1);
}
}
}
}
void ConvertBinaryToOctal()
{
string tempBinaryNumberStr = binaryNumberStr;
int tempVal;
octalNumberStr = "";
const int sizeOfBinaryNumberStr = tempBinaryNumberStr.size();
if (sizeOfBinaryNumberStr % 3 == 1)
{
tempVal = tempBinaryNumberStr[0] - '0';
octalNumberStr += std::to_string(tempVal);
}
else if (sizeOfBinaryNumberStr % 3 == 2)
{
tempVal = (tempBinaryNumberStr[0] - '0') * 2 + (tempBinaryNumberStr[1] - '0');
octalNumberStr += std::to_string(tempVal);
}
for (int i = sizeOfBinaryNumberStr % 3; i < sizeOfBinaryNumberStr; i += 3)
{
tempVal = (tempBinaryNumberStr[i] - '0') * 4 + (tempBinaryNumberStr[i+1] - '0') * 2 + (tempBinaryNumberStr[i+2] - '0');
octalNumberStr += std::to_string(tempVal);
}
}
void printBinaryNumberStr()
{
std::cout << binaryNumberStr;
}
void printOctalNumberStr()
{
std::cout << octalNumberStr;
}
void setOctal(const int i)
{
octalNumberStr = to_string(i);
}
void setBinary(const int i)
{
binaryNumberStr = to_string(i);
}
};
int main()
{
COctalBinaryConvertor* cOctalBinaryConvertor = new COctalBinaryConvertor();
// 값을 입력받는다.
cOctalBinaryConvertor->inputBinary();
// 값을 변환한다.
cOctalBinaryConvertor->ConvertBinaryToOctal();
// 결과를 출력한다
cOctalBinaryConvertor->printOctalNumberStr();
//for (int i = 0; i < 50; i++)
//{
// if ((i % 10 < 8))
// {
// COctalBinaryConvertor->setOctal(i);
// // 값을 변환한다.
// COctalBinaryConvertor->ConvertOctalToBinary();
// // 결과를 출력한다
// COctalBinaryConvertor->output();
// cout << endl;
// }
//}
return 0;
}
무엇인가 얻어가셨기를 바라며
오늘도 즐거운 코딩하시길 바랍니다 ~ :)
참조 및 인용
C++ Primer
Introduction to Algorithms
https://codemasterkimc.tistory.com/35
C++ 이론을 배울수 있는 곳 정리
개요 C++을 배우는 책, 강의, 블로그, 링크 등을 공유합니다. (링크 및 간략한 설명을 하였으나 만약 원작자가 링크를 거는것을 원치 않을 경우 연락주시기 바랍니다.) 서적 https://www.amazon.com/Prime
codemasterkimc.tistory.com
https://codemasterkimc.tistory.com/50
300년차 개발자의 좋은 코드 5계명 (Clean Code)
이번 글을 통해 배워갈 내용 좋은 코드(Clean Code)를 작성하기 위해 개발자로서 생각해볼 5가지 요소를 알아보겠습니다. 개요 좋은 코드란 무엇일까요? 저는 자원이 한정적인 컴퓨터 세상에서 좋
codemasterkimc.tistory.com
'C++ > C++ 알고리즘' 카테고리의 다른 글
| 백준2609번 GCD, LCM 최대공약수, 최소공배수 C++로 구현해보기 (0) | 2021.08.29 |
|---|---|
| 백준10773번 간단한 스택구조 C++로 구현해보기 (0) | 2021.08.29 |
| 백준1043번 거짓말 C++로 구현해보기 (0) | 2021.08.27 |
| 백준3053번 택시기하학(Taxi Geometry) C++로 구현해보기 (0) | 2021.08.24 |
| 백준1269번 대칭 차집합(Symmetric Difference) C++로 구현해보기 (0) | 2021.08.24 |