소스코드

#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에서 하나를 빼 마지막 자리가 출력되지 않도록 하는 한 줄을 추가하여 풀었다. 

푸는데 오래 걸림.. 아직 조금 더 연습이 필요할 것 같다. 

복사했습니다!