[c/c++] 백준 1065 (Silver 4)

은동·2023년 2월 18일
0

Baekjoon

목록 보기
31/49

🔨 문제

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

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

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

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


🔨 해결방법

1~99까지는 모두 한수이다.

하지만 100이상의 입력이 들어온다면?
99를 최종 출력값에 저장시키고, 100부터 입력값까지 비교해주면 된다.

이 문제에서는 string 헤더에 있는 stoi()와 to_string()함수를 사용하였다.
stoi() 함수는 문자열을 정수형으로 변환시켜주고,
to_string()함수는 정수형을 문자열로 변환시켜준다.

내 코드를 다시보니 stoi()는 사용하지 않아도 됐구나..^^ 이런 문자열 문제에 자주 쓰이는 함수이다보니 나도 모르게 썼나보다 ㅎㅎ


🔨 코드

#include <iostream>
#include <string>
using namespace std;

int main(){

    cin.tie(NULL);
    cout.tie(NULL);
    ios::sync_with_stdio(false);

    string n;
    cin >> n;
    int buffer[4] = { 0 };
    int cnt=0;

    if (stoi(n) < 100) {
        cnt += stoi(n);
    }
    else {
        cnt += 99;
        for (int i = 100; i <= stoi(n); i++) {
            string s = to_string(i);
            int buffer = s[0] - s[1];
            // index 0과 1의 차이를 buffer에 저장
            for (int j = 1; j < s.size()-1; j++) {
                if (buffer != s[j] - s[j+1]) break;
                else cnt++;
                // 그 다음 인덱스 비교값이 buffer와 다르다면 for문을 빠져나오고, 아니라면 출력값에 ++
            }
        }
    }
    cout << cnt;
    
    return 0;
 }
profile
자자 선수입장~

0개의 댓글