소스코드
#include <stdio.h>
#include <string.h>
int main (){
char a[1000001];
scanf("%s", &a);
int len = strlen(a);
char array[333334];
int i, index = 0, cur = 0, temp = 0, b = 1, c=0;
for(i=len-1; i>=0; i--){
temp = temp + (a[i] - '0')*b;
b = b*2;
cur++;
if(cur==3){
array[c++] = temp+'0';
cur = 0;
b = 1;
temp = 0;
}
if (i == 0) array[c] = temp+'0';
}
if (c != 0 && len%3 == 0) c--;
for(i=c; i>=0; i--){
printf("%d", array[i]-'0');
}
}
일단 구현상 어려움이라기보다는 발상에 문제가 있었다.
해설
처음에 일단 10진수로 변환후 8진수로 바꾸는 알고리즘을 썼는데 그렇게 할 경우 10진수로 변환한 숫자가 너무너무 커진다. 애초부터 1000000자리라는 것은 그걸 숫자로 변환하는 것은 불가능하고 세 자리씩 합해 8진수로 만드는 방법을 썼어야 하는데 말이다. 이 생각을 늦게해서 푸는데 오래 걸렸다,
또 for loop 돌면서 i==0일 때, 즉 마지막에 한 자리를 array 끝에 저장했는데, 이 때 i==0이어도 마지막에 숫자가 남지 않는 경우를 생각하지 못했다. 이거 예외처리하는데 어려움을 좀 겪었다. 결국 len%3==0이면서 c!=0일 때, 즉 한 자리가 아닐 때만 c에서 하나를 빼 마지막 자리가 출력되지 않도록 하는 한 줄을 추가하여 풀었다.
푸는데 오래 걸림.. 아직 조금 더 연습이 필요할 것 같다.
'solving > C, C++' 카테고리의 다른 글
[백준] 2493번 탑 - C++ (0) | 2022.09.24 |
---|---|
[백준] 1018 체스판 다시 칠하기 - C++ (Bruteforece, 완전탐색) (1) | 2022.09.21 |
[백준] 1356번 유진수 (숫자 배열로 받기, 배열에서 index 이동시키기) (0) | 2022.09.05 |
[백준] 1296번 팀 이름 정하기 (변수 설정, strcmp) (0) | 2022.09.04 |
[백준] 1236번 성 지키기 (이차원 배열) (1) | 2022.09.02 |