티스토리 뷰

백준 온라인 저지(BOJ) 1065번 한수
https://www.acmicpc.net/problem/1065
1065번: 한수
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나
www.acmicpc.net
* 사용언어 : C언어, C++
1. 문제
어떤 양의 정수 X의 각 자리수가 등차수열을 이루면 그 수를 한수라고 함
입력 N에 대해서 1보다 크거나 같고 N보다 작거나 같은 한수의 개수를 출력
(1 ≤ N ≤ 1000)
2. 풀이
우선 한수에 대해 생각해보겠습니다.
한수가 되려면 각 자리수가 등차수열을 이뤄야 합니다.
예를 들어 147이라는 수를 생각해보면,
1, 4, 7 세 숫자가 공차가 3인 등차수열이 되므로 147은 한수가 됩니다.
그 밖에 123, 246, 852 ... 과 같은 숫자들도 한수겠죠.
그렇다면 등차수열이 성립하지 않는 1자리 or 2자리 숫자는 어떻게 봐야 할까요?
이는 문제의 입, 출력 예시로 생각해보았습니다.
문제의 첫 번째 예제에서 입력은 110이고 출력은 99입니다.
여기서 100 부터 110 까지 숫자 중에 한수는 없습니다.
즉, 1부터 99까지를 모두 한수로 본 것입니다.
그런 이유로 저는 한수를 확인하는 함수(chk(int n))를 만들 때,
함수의 매개변수는 모두 3자리 숫자라고 가정하고 코딩했습니다.
모든 자리수에 대해 가능하도록 일반화하여 코딩할 수도 있겠지만,
가성비가 안나와서 그냥 이 문제에 맞게 간단하게 풀었습니다.
풀이에 비해 코드는 간단하니 코드 설명은 생략하겠습니다.
3. 코드
#include <stdio.h>
int chk(int n) {
int n1 = n % 10;
int n2 = n / 10 % 10;
int n3 = n / 100 % 10;
if (n2 * 2 == n1 + n3) return 1;
return 0;
}
int main() {
int n;
scanf("%d\n", &n);
int ret;
if (n < 100) ret = n;
else {
ret = 99;
if (n == 1000) n = 999;
for (int i = 100; i <= n; ++i) {
ret += chk(i);
}
}
printf("%d\n", ret);
return 0;
}
* 한수가 아닌 1000 이 chk 함수에서는 한수로 처리되므로 999 로 변경했습니다.
* 3자리 인지 확인(if (n < 1000))을 반복하지 않도록 for 문 밖에서 처리했습니다.
'개발자 > 문제풀이 (C언어)' 카테고리의 다른 글
[백준/BOJ] 11720번 숫자의 합 (C/C++) (0) | 2022.06.06 |
---|---|
[백준/BOJ] 11654번 아스키 코드 (C/C++) (0) | 2022.06.04 |
[백준/BOJ] 4673번 셀프 넘버 (C/C++) (0) | 2022.05.26 |
[백준/BOJ] 15596번 정수 N개의 합 (C/C++) (0) | 2022.05.25 |
[백준/BOJ] 2480번 주사위 세개 (C/C++) (0) | 2022.05.22 |
- Total
- Today
- Yesterday
- AdSendse
- 독서 감상평
- 유연함의힘
- 세상을 읽는 새로운 언어 빅데이터
- 나의첫죽음학수업
- 안전운전특약
- 최재천의공부
- 삼성전자
- 쿠프마케팅
- 자료구조
- 문현공
- 자동차보험
- 나는늘잘해야한다고생각한다
- 관계가상처가되기전에
- 동탄에듀센터
- 영화감상평
- 긴 자리 덧셈 뺄셈
- 센터독서클럽
- 정올
- 정세현의통찰
- 알고리즘
- 여가포인트
- 독서감상평
- JUNGOL
- 호암의마지막꿈
- 당신도느리게나이들수있습니다
- 긴 자리 곱셈
- 인간본성불패의법칙
- 시대예보
- 동탄에듀센터2
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |