[백준 알고리즘]/[C++]

1065번 한수 / Baekjoon BOJ 백준 1065 C++ 코드, 해설, 풀이

말하는펭귄 2020. 9. 4. 23:16
728x90
반응형

이번 포스팅은 백준 1065번 한수입니다.

아래 url를 클릭하시면 백준 사이트에서 문제를 볼 수 있습니다.

https://www.acmicpc.net/problem/1065

 

1065번: 한수

어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 ��

www.acmicpc.net

 

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
#include <iostream>
using namespace std;
 
bool checkMatch(int n);
 
int main() {
    int n;
    cin >> n;
 
    int ans = 0;
    for (int i = 1; i <= n; i++) {
        if (checkMatch(i) == true) ans += 1;
    }
    cout << ans;
 
    return 0;
}
 
bool checkMatch(int n) {
    int digit1, digit2, digit3;
    digit1 = n / 100//백의 자리
    digit2 = (n / 10) % 10//십의 자리
    digit3 = n % 10//일의 자리
 
    int diff1, diff2;
    diff1 = digit1 - digit2;
    diff2 = digit2 - digit3;
    
    if (n < 100 || diff1 == diff2) return true;
    else return false;
}
cs

 

함수를 만드는 연습을 하는 간단한 문제입니다. 

 

문제 조건에서의 "한수"는 어떠한 수의 각 자릿수가 등차수열 즉, 일정한 차이를 이루는 수입니다. (수학 용어인가 해서 수학용어사전을 찾아보았으나 공식적인 단어는 아닌 거 같습니다. ㅎㅎ)

따라서 한 자릿수와 두 자릿수는 모두 한수에 해당합니다.

 

문제 조건에서 1000 이하의 자연수 N이 주어진다고 명시되어있으므로 세 자릿수 N의 한수 여부를 판단해주는 bool 함수 checkMatch를 작성해 N이하의 한수의 개수를 구해봅시다.

 

각 자리수를 추출하기 위해 int형 변수를 자리마다 구하기 위해 '/', '%' 연산자를 사용합니다.

C 코딩에 아직 익숙하지 않으신 분들을 위해 설명을 드리자면 '/'는 나누기 연산자로 int형 변수에 사용 시 나눈 몫이, '%'는 나머지 연산자로 int형 변수에 사용 시 나눈 나머지가 저장됩니다.

 

한수 판별의 조건인 등차수열을 만족하는지는 각 자릿수의 차이를 직접 비교하여 구합니다. 같은 값(등차수열의 공차)이면 되므로 절댓값을 비교할 필요가 없으니 차이 값을 직접 비교하면 됩니다. 즉, checkMatch함수가 참으로 리턴하는 조건은 세 자릿수 미만의 수 또는(OR) 각 자리 수의 차이가 같은 수입니다.

 

 

 

728x90
반응형