문제
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.
출력
첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.
문제 링크
풀이
수의 각 자릿수가 등차수열을 이루는 지를 확인하는 문제다.
더 효율적이고 세련되게 푸는 방법이 있는 지도 모르고, 굳이 그렇게 풀 필요가 있나 싶어서 그냥 하나하나 검사하는 식으로 코드를 짰다.
그리고 애초에 1000까지만 들어와서 최대로 들어와야 4자리수다.
심지어 그 4자리수도 1000하나인데 얜 한수가 아니라 3자리수까지만 생각해도 된다.
프로그램 동작
내가 한수를 직접 만들어가며 세는 것도 한 가지 방법이 되겠으나, 수 자체가 작아서 다 검사하는 방향을 골랐다.
1. 입력 받은 수가 두 자리 이하의 수라면, 입력 받은 수를 출력한다.
만약 세자리 수가 들어왔다면 1부터 99까지는 모두 한수이므로, 한수 개수에 99를 더하고 100부터 한수 검사를 한다.
2. 먼저 들어온 숫자의 각 자리 수를 배열에 넣어준다.
3. 배열에 들어온 수들의 차이를 구한다.끝까지 검사했는데 같다면, true를 반환한다.
이 때 이전에 구했던 차이와 지금 구하는 차이가 다르다면, 한수가 아니므로 false를 반환한다.
이 과정을 100부터 주어진 수 까지 반복하면서 개수를 세준다.
Swift 코드
var N = Int(readLine()!)!
var counter = 0
func hansu(_ k: Int) -> Bool {
var checker = 0
let i = String(k)
var arr = [Int]()
for j in i {
let a = Int(String(j))!
arr.append(a)
}
checker = arr[0] - arr[1]
for i in 0..<(arr.count - 1) {
if checker != arr[i] - arr[i + 1] {
return false
}
}
return true
}
if N < 100 {
print(N);
} else {
counter += 99
for i in 100...N {
if hansu(i) == true {
counter += 1
}
}
print(counter)
}
처음에는 딱히 검사안하고 한 자리 수만 거르고 두 자리 수부터 검사를 시작했는데, 생각해보니 1부터 99까지는 모두 한수였다.
그래서 100부터 검사하게끔 코드를 바꿔서 올렸다.
근데 어차피 인풋이 워낙 적어서 실행시간 속도 차이는 크지 않았다.
C++ 코드
#include<iostream>
#include<vector>
using namespace std;
void hansu(int a, int& count2)
{
vector <int> num1;
vector <int> num2;
int size = 0;
int count = 0;
if (a < 10) {
count2++;
} else {
while (a) {
num1.push_back(a % 10);
a = a / 10;
size++;
}
for (int i = 0; i < size - 1; i++) {
num2.push_back(num1[i] - num1[i + 1]);
}
for (int i = 0; i < num2.size() - 1; i++) {
if (num2[i] == num2[i + 1]) {
count++;
}
}
if (count == num2.size() - 1) {
count2++;
}
}
}
int main() {
int N = 0;
cin >> N;
int count = 0;
for (int i = 1; i < N+1; i++) {
hansu(i, count);
}
cout << count;
}
'Algorithm > PS' 카테고리의 다른 글
백준 1167번 트리의 지름 - SWIFT (0) | 2024.02.20 |
---|---|
백준 1030번 프랙탈 평면 - C++ (0) | 2024.02.18 |
LeetCode 2. Add Two Numbers - C++ (0) | 2024.02.13 |
LeetCode 1. Two Sum - C++ (0) | 2024.02.13 |
백준 1152번 단어의 개수 - SWIFT, C++ (0) | 2024.02.13 |