https://www.acmicpc.net/problem/1373
1373번: 2진수 8진수
첫째 줄에 2진수가 주어진다. 주어지는 수의 길이는 1,000,000을 넘지 않는다.
www.acmicpc.net
오답코드
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main()
{
string two;
cin >> two;
unsigned long long TwoToTen = 1;
unsigned long long ten=0;
for (long long i = two.size() - 1; i >= 0; i--)
{
ten = ten + (int(two[i] - '0') * TwoToTen);
TwoToTen = TwoToTen * 2;
}
stack<unsigned long long> eight;
while (1)
{
if (ten / 8 == 0)
{
eight.push(ten);
break;
}
else
{
eight.push(ten % 8);
ten = ten / 8;
}
}
while(!eight.empty())
{
cout << eight.top();
eight.pop();
}
}
처음에는 2진수->10진수->8진수로 하자는 생각을 했고 그 과정에서 stack을 사용하였다.
그러나 문제가 수의 크기 제한이 1,000,000이 아니라 길이 제한이 1,000,000이기 때문에 메모리 문제가 발생한다.
맞은코드
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main()
{
string two;
cin >> two;//2진수 입력
if (two.size() % 3 == 1)//size가 3으로 안나누어 떨어지면 3으로 나누어떨어지도록 앞에 계산에 영향없는 '0'추가
{
two = "00" + two;
}
else if (two.size() % 3 == 2)
{
two = '0' + two;
}
for (int i = 0; i < two.size(); i = i + 3)//2진수를 3칸으로 앞에서부터 4,2,1을 곱하고 더해서 출력
{
cout << int(two[i]-'0') * 4 + int(two[i + 1]-'0') * 2 + int(two[i + 2]-'0') * 1;
}
}
3칸씩 나누어서 계산한다 3으로 안나누어 떨어질 경우 앞에 값에 영향을 안주는 0을 추가하고 계산을 시작한다
'백준 c++ > (1-1)백준 c++ 알고리즘 기초' 카테고리의 다른 글
백준 2089 c++ -2진수 (0) | 2022.07.12 |
---|---|
백준 1212 c++ 8진수 2진수 (0) | 2022.07.12 |
백준 17087 c++ 숨바꼭질 6 (0) | 2022.07.07 |
백준 9613 c++ GCD합 (0) | 2022.07.07 |
백준 2004 c++ 조합 0의 개수 (0) | 2022.07.07 |