https://www.acmicpc.net/problem/1373
우선 문제부터 요약하면,
2진수가 주어지면, 해당 수를 8진수로 바꾸어서 출력해야 하는 문제입니다.
<Solution>
뒤에서 부터 parsing을 해야하므로 나중에 들어온 input부터 처리할 수 있는 stack등의 자료 구조를 활용할 수 있습니다. 하지만 stack을 사용하면, push는 그냥 input으로 char array를 만들어 넣을 수 있지만 pop을 하게 되면, function call이 일어나거나 하면 속도가 느려질 수 있습니다.
그래서 직접 index를 이용하여 forloop를 이용하여 처리하였습니다. 이 때, 뒤에서 부터 3개씩 잘라서 처리를 하다 보면, 끝에는 0~3개사이의 랜덤한 숫자갯수가 남게 되므로 이 부분의 처리를 corner case가 없도록 주의해서 처리해야 합니다.
예를 들면, 0이 앞에 하나 더 붙을 수도 있고, 0에 대해 아무것도 출력하지 않는 error가 있을 수 있습니다.
실제 구현은 아래와 같습니다.
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
char s[1000000+10];
char ans[400000];
int main(){
cin >> s;
// if 0 comes in just return
if(strlen(s) == 1 && s[0]-'0' == 0){
cout << 0 << endl;
return 0;
}
int index = strlen(s)-1;
int ans_index = 0;
for(int i =0; i<strlen(s)/3; i++){
int p = 1*(s[index]-'0') + 2*(s[index-1]-'0') + 4*(s[index-2]-'0');
index -= 3;
ans[ans_index++] = (char)(p+'0');
}
// left over
int p = 0;
for(int i=0; i<strlen(s)%3; i++){
p += (s[index--]-'0') * 1<<i;
}
if (p !=0)ans[ans_index] = (char)(p+'0');
reverse(ans, ans+strlen(ans));
cout << ans << endl;
return 0;
}
반응형
'코딩테스트 > C++ 문제풀이' 카테고리의 다른 글
[백준] 계단 수 (0) | 2023.03.02 |
---|---|
[백준] 부분수열의 합 2 (0) | 2023.03.01 |
[백준] 보석 도둑 (0) | 2023.02.27 |
[백준] 두 배열의 합 (0) | 2023.02.13 |
[백준] 다각형의 면적 (0) | 2023.02.13 |