반응형
숫자 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 |