[BOJ/1065/C++] 한수

SHark·2023년 3월 6일
0

BOJ

목록 보기
15/59

출처 : https://www.acmicpc.net/status?user_id=sharkkk&problem_id=1065&from_mine=1

문제

  • N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.

조건

  • 어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다.

SOL

처음에 1000이하인줄 모르고, 일반화시켜서 풀다가 , 각각의 자릿수 분리 후 -> 배열 저장 -> 공차가 다른게 나오는 순간 return false해주기로 풀었다.

1,000,000이라도, 각 자릿수를 나누는건 연산횟수가 10회 미만이므로, 10의 10승까지는 int가 못나타내니까, 아무리 커봤자 Int 범위내에서는 2억번 안쪽으로 나올거 같아서 자릿수를 기준으로 풀어버렸다.

항상 조건을 잘보도록하자. 쉽게 풀 수 있는 문제를 어렵게 푸는 것도 손해이다.(3자리 수이면 말이 달라지지)

첫번째 풀이(자릿수를 분리)

#include <bits/stdc++.h>
#define fastio cin.tie(0)->sync_with_stdio(0)
using namespace std;

int split_Number(int arr[], int N)
{
  int cnt = 0;
  while (N > 0)
  {
    arr[cnt] = N % 10;
    N /= 10;
    cnt++;
  }
  return cnt;
}
bool check_Hansu(int arr[], int len)
{
  int gap = arr[1] - arr[0];
  for (int i = 1; i < len; i++)
  {
    if (gap != arr[i] - arr[i - 1])
    {
      return false;
    }
  }
  return true;
}
int main()
{
  fastio;
  int N, L, M, R;
  int ans = 0;
  int len;
  cin >> N;
  if (N < 100)
  {
    cout << N;
    return 0;
  }
  for (int i = 100; i <= N; i++)
  {
    int arr[10] = {};
    len = split_Number(arr, i);
    if (check_Hansu(arr, len))
      ans++;
  }
  cout << 99 + ans << '\n';
  return 0;
}

두번째 풀이 (문제의 조건에 맞게)

#include <bits/stdc++.h>
#define fastio cin.tie(0)->sync_with_stdio(0)
using namespace std;

int main()
{
  fastio;
  int N, L, M, R;
  int ans = 0;
  cin >> N;
  if (N < 100)
  {
    cout << N;
    return 0;
  }
  for (int i = 100; i <= N; i++)
  {
    L = i / 100;
    M = i / 10 % 10;
    R = i % 10;
    if (R + L == 2 * M)
      ans++;
  }
  cout << 99 + ans << '\n';
  return 0;
}

0개의 댓글