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