본문 바로가기
BOJ

[C] 백준 1769번: 3의 배수

by 야호호코코 2018. 7. 22.
반응형

  숫자 1,000,000자리라는 조건을 1,000,000까지라고 봐서 사실상 서로 다른 코드를 두 번 짰다. 이래서 시력이 좋아야 고생을 안한다. 백만자리까지 입력 가능하기 때문에 C언어에서는 문자열로 해결해야한다. 이럴 때마다 파이썬을 쓰고 싶어진다.



 


입출력 예시


입력

출력

9

0

YES

힌트) 9 (0번 변환, 3의 배수)


입력

출력

1234567

3

NO

힌트) 1234567 -> 28 -> 10 -> 1 (3번 변환, 3의 배수 아님)



 정답 코드

#include <stdio.h>
#include <string.h>

void sumAll(char *, int *);
void pasteInt(char *, int);
int isThree(int);

int main() {

	char n[1000001];
	int int_n = 0;

	int count = 0;

	scanf("%s", n);

	if (strlen(n) == 1) {
		sumAll(n, &int_n);
	}
	else {
		int_n = 10;
	}

	while (int_n >= 10) {
		sumAll(n, &int_n);
		pasteInt(n, int_n);
		count++;
	}

	printf("%d\n", count);

	if (isThree(int_n))
		printf("YES");
	else
		printf("NO");

	return 0;

}

void sumAll(char *str, int *n) {

	int i;

	*n = 0;

	for (i = 0; str[i]; i++) {
		(*n) += (str[i] - '0');
	}

}

void pasteInt(char *str, int n) {

	int i = 0;

	while (n > 0) {
		str[i++] = (n % 10) + '0';
		n /= 10;
	}

	str[i] = NULL;

}

int isThree(int n) {
	return n == 3 || n == 6 || n == 9;
}


코드 설명


1. 최대 백만 자리까지 숫자(를 가장한 문자열)를 입력받는다.


2. 만약 입력받은 숫자가 1자리 숫자라면 그대로 통과시키기 위해 자릿수를 전부 더하는 계산을 해주고 아니면 while을 실행시켜야 하므로 10을 int_n에 저장해준다.


3. while문은 int_n(각 자릿수를 더한 값)이 10 이상이면 계속 실행된다. 각 자릿수를 모두 더해 int_n에 저장하고, 문자열에 int_n의 각 자릿수를 다시 저장해주는 것을 반복한다. 이 때, 문자열에 각 자리수를 저장하는 것은 어차피 다시 더할 용도이기 때문에 자릿수를 맞추지 않고 일의 자리를 0번 인덱스로 시작해 쭉 저장한다.


4. while문을 탈출하거나 통과하고난 뒤, count(while문이 돌아간 횟수 즉, 변환 횟수)를 출력해주고 int_n이 3 혹은 6 혹은 9인지 검사해 YES, NO를 출력한다.


반응형

'BOJ' 카테고리의 다른 글

[C] 백준 2851번: 슈퍼 마리오  (0) 2018.07.25
[C] 백준 1237번: 정ㅋ벅ㅋ  (0) 2018.07.22
[C] 백준 1059번: 수2  (0) 2018.07.20