https://www.acmicpc.net/problem/1065
문제
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.
출력
첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.
접근방식
문제를 이해 하는덴 오래걸렸다.
우선 한수의 뜻은 "각 자리수들이 등차수열을 이루는 수"이다. 등차수열이란 각 항들이 일정한 차이를 보이는 수열이다.
- 이해한 방법을 위와 같이 정리를 해보았다.
- 각각의 자리수의 갭이 모두 같은 경우 한수이고 하나라도 아닌 경우에는 한수가 아니다.
※ 이 문제에서는 입력받은 값이 한수인지를 Check하는 것이 아니라
1 ~ 입력받은 값 까지 한수의 개수를 구하는 것이다
풀이 방법
1. 사용자에게 숫자를 입력 받아온다 |
-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 - 1, 1));
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(1, len(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
#자연수 입력
a = 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 |
'개발 > Algorithm' 카테고리의 다른 글
[Algorithm] 백준 알고리즘 11720번 숫자의 합 ( C# / Python / Java ) (0) | 2020.06.09 |
---|---|
[Algorithm] 백준알고리즘 아스키 코드 출력 / C# / Python / Java (0) | 2020.06.08 |
[Algorithm] 백준 알고리즘 셀프넘버 (0) | 2020.06.06 |
[Algorithm] C# /Python / Format 함수 (0) | 2020.06.05 |
[Algorithm] C# 속도측정 하는 법 Stopwatch / Python / 백준알고리즘 평균 (0) | 2020.06.03 |