[BOJ] 1065_한수

gogori6565·2022년 7월 21일
0

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


풀이
1. 한 자리 수는 한수이다.
2. 두 자리 수는 한수이다.
=> 즉, 1~99는 한수이다. (고려사항X)
3. 세 자리 수부터 한수를 구분해야한다.

  • N<1000 이므로 세 자리 수만 고려하면 됨
  • N의 각 자리를 끊어서 요소가 3개인 배열에 집어넣는다
for(int j=i;j>0;j/=10)
	num[index++]=j%10;
  • (num[0]-num[1])==(num[1]-num[2]) 으로 각 자리가 등차수열을 이루는지 검사한다.
  • 예외)) 입력이 1000인 경우, 위 검사에서 '000'으로 count가 올라가지 않도록 입력 1000인 경우는 카운트 하지 않게 따로 빼줘야한다.

풀이 코드

#include<iostream>
using namespace std;

int main(void)
{
    cin.tie(NULL); ios_base::sync_with_stdio(false);

    int n,index=0,count=0;
    cin>>n;
    int arr[1001]={0,};
    int num[3];

    for(int i=1;i<=n;i++)
    {
        if(i<100)
            arr[i]++;
        else if(i==1000)
            break;
        else
        {
            for(int j=i;j>0;j/=10)
                num[index++]=j%10;
            
            if((num[0]-num[1])==(num[1]-num[2]))
                arr[i]++;
        }
        index=0;
    }

    for(int i=1;i<=n;i++)
    {
        if(arr[i]!=0)
            count++;
    }
    
    cout<<count;
    return 0;
}

💡 유의한 점!
1) 처음에 for문을 for(int i=0;i<n;i++) 로 해서 0인 경우도 한수로 처리해 count가 +1 되었다.
-> for(int i=1;i<=n;i++) 로 고쳐주었다. 대신, i<=n 이므로 배열의 크기를 1001 로 키워주어야한다. 마지막 출력 for문도 고쳐준다.

2) 입력이 1000인 경우 i=1000이 될 때, num배열의 0,1,2번째 인덱스에 각각 0이 들어가 한수로 보기 때문에 카운트되지 못하게 막아줘야한다. (break)


문제 출처 : https://www.acmicpc.net/problem/1065

profile
p(´∇`)q

0개의 댓글