본문 바로가기

개발/Algorithm

[Algorithm] 백준 알고리즘 등차수열 한수 / C# / Python

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

 

1065번: 한수

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

www.acmicpc.net


문제

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

입력

첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.

출력

첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.

 

 

 


 

접근방식

 

문제를 이해 하는덴 오래걸렸다.

 우선 한수의 뜻은 "각 자리수들이 등차수열을 이루는 수"이다. 등차수열이란 각 항들이 일정한 차이를 보이는 수열이다.

 

 

 

- 이해한 방법을 위와 같이 정리를 해보았다.

- 각각의 자리수의 갭이 모두 같은 경우 한수이고 하나라도 아닌 경우에는 한수가 아니다. 

 

 

※ 이 문제에서는 입력받은 값이 한수인지를 Check하는 것이 아니라

   1 ~ 입력받은 값 까지 한수의 개수를 구하는 것이다

 

 

 

풀이 방법

1. 사용자에게 숫자를 입력 받아온다
2. 사용자 입력값이 99이하인 경우 그 수는 한수 이다 → 그대로 출력
3. 사용자 입력값이 100이상인 경우에는 100부터 ~ 사용자 입력값까지의 한수 개수를 구한다. (99개의 한수는 당연 더함)
4. 한수를 Check하는 함수를 따로 만든다음 한수 인지 아닌지는 boolean값으로 가져온다.
5. true인 경우는 +1,  false인 경우는 +0 

 


-C#

 

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
55
56
57
58
using System;
using System.Collections.Generic;
 
namespace test20
{
    class Program
    {
        static void Main(string[] args)
        {
            Program pg = new Program();
 
            //값을 입력받는다.
            int num = int.Parse(Console.ReadLine());
 
            if (num < 100//99이하의 수는 모두 한수이다.
            {
                Console.WriteLine(num);
            }
            else //99이상인 것 중에서 한수의 개수를 구해온다.
            {
                int cnt = 99// 한수 개수 count
                for (int i = 100; i < num + 1; i++)
                {
                    cnt = pg.CheckNum(i) ? cnt + 1 : cnt;
                }
                Console.WriteLine(cnt);
                Console.ReadLine();
            }
 
        }
 
        /// <summary>
        /// 한수 Check 함수
        /// </summary>
        /// <param name="i_num"></param>
        /// <returns></returns>
        private bool CheckNum(int i_num)
        {
            //각 자리수의 차수 구하기
            var subLst = new List<int>();
            for (int i = 1; i < i_num.ToString().Length; i++)
            {
                int num1 = int.Parse(i_num.ToString().Substring(i - 11));
                int num2 = int.Parse(i_num.ToString().Substring(i, 1));
                subLst.Add(num2 - num1);
            }
 
            //각 자리수의 차수가 다른 경우 Check
            bool check = true;
            for (int i = 1; i < subLst.Count; i++)
            {
                if (subLst[i - 1!= subLst[i]) check = false;
            }
            return check;
        }
    }
}
 
cs

 

 

 

-Python

 

 

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
def checkNum(num):
 
    check = True
 
    #각 자리수의 차수 저장
    lst = list()
    for i in range(1len(str(num))):
        num1 = int(str(num)[i])
        num2 = int(str(num)[i - 1])
        lst.append(num1 - num2)
    
    #각 자리수 비교
    checkTmp = 0
    for i in range(0,len(lst)):
        if i == 0: checkTmp = lst[i]
        
        if checkTmp != lst[i]: 
            check = False
            break
 
    return check
        
 
#자연수 입력
= int(input())
 
#99이하 수는 모두 한수
if a < 100:
    print(a)
else:
    cnt = 99 #99이하는 모두 한수이기 때문에
    for i in range(100,a + 1):
        #한수인지 아닌지 Check
        if checkNum(i):
            cnt += 1
 
    print(cnt)
cs