2018.12.23.
문제 출처:
https://www.acmicpc.net/problem/1065
문제 분석:
어떤 정수의 자릿수가 등차수열을 이룰때 이를 한수 라고한다.
1000보다 작은 자연수 N이 주어졌을때 N보다 작은 한수의 개수를 출력한다.
문제 해결:
답 예시를 봤을때
일의자리수인
ex) 1,3,5
등은 모두 한수 였고
십의자리수
ex) 11, 22, 35
모두 한수로 처리했다
즉, 백의 자리 숫자만 확인해 주면 됬던것이다.
배열 arr 안에 0을 모두 넣어주고
한수를 찾는 FindHan()을 만들었다.
입력받은 세자리수를 각각 분리하여 numarr안에 넣어주고
공차가 일치한지 확인해주고 맞으면 1을 반환한다.
arr이 1인 것의 개수를 세준다.
내 소스코드:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int FindHan(int i); int main() { int arr[1001] = { 0, }; int ans = 0; int N; scanf("%d", &N); for (int i = 1;i < 100;i++) { arr[i] = 1; } for (int i = 100;i < 1000;i++) { arr[i] = FindHan(i); } for (int i = 1;i <= N;i++) { if (arr[i] == 1) { ans += 1; } } printf("%d", ans); } int FindHan(int num) { int numarr[3]; for (int i = 0;i < 3;i++) { numarr[i] = num % 10; num = num / 10; } if (numarr[2] - numarr[1] == numarr[1] - numarr[0]) { return 1; } else { return 0; } } | cs |
실행결과:
고찰:
위에 짠 프로그램은 3자리수 일때 까지 밖에 구할 수 없는 프로그램이다.
그래서 모든 수를 입력받으려면 어떻게 해야될까 고민해보았다.
먼저 생각된것은 한수의 최대값은 9876543210일 것이다.
생각 한 방법은 위와 같이 자리수를 나눠주어 각각 공차를 비교해주는 방법이 있었다.
'알고리즘 > 알고리즘 문제풀이' 카테고리의 다른 글
2448번: 별 찍기 - 11 (0) | 2018.12.28 |
---|---|
2444번: 별 찍기 - 7 (0) | 2018.12.26 |
2443번: 별 찍기 - 6 (0) | 2018.12.26 |
2442번: 별 찍기 - 5 (0) | 2018.12.26 |
4673번: 셀프넘버 (0) | 2018.12.25 |