40. C++ 백준 1065 번 한수
안녕하세요! 코딩하는 덕구입니다!
X 가 한수인지 판별하는 함수를 정의하여 푸는 문제인 C++ 백준 1065 번 입니다!
문제
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.
출력
첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.
https://www.acmicpc.net/problem/1065
1065번: 한수
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나
www.acmicpc.net
제 코드입니다!
#include <iostream>
using namespace std;
bool isHan[1000] = {false,}; //어떤 숫자가 한수이면 참, 아니면 거짓
void d(int N){
int a,b,c; //1,2,3 번째 자리의 수
for(int i = 1; i<=N; i++) {
c = i % 10; //셋째 자리 = 숫자 %10
b = (i % 100) / 10; //둘째 자리 = 숫자 %100/10
a = (i % 1000) / 100; //첫째자리 = 숫자 % 1000/100
if (a > 0){ // 100의 자리 숫자가 1 이상일때 (숫자가 100 이상일때)
if (a - b == b - c) //첫째 자리 - 둘째 자리 == 둘째자리 - 셋째 자리
isHan[i] = true;
}
else if(i == 1000) //i 가 1000 일때 (4자리 한수 확인 못하는 함수임 그래서 예외처리)
isHan[i] = false;
else //i 가 100보다 작을 때 (1~99)
isHan[i] = true; //1~99 까지는 모두 한수이다.
}
}
int main(){
int N, cnt = 0;
cin>>N;
d(N);
for(int i=1; i<=N; i++) //1부터 N까지
if(isHan[i] == 1) //어떤 숫자가 한수이면
cnt++; //카운트
cout<<cnt; // 카운트를 출력
return 0;
}
먼저 어떤 숫자가 한수이면 true 그렇지 않으면 false 를 저장하는
bool type(자료형)의 배열인 isHan 을 만들었고 (기본값은 false)
특정 숫자에 대해서 1~N까지의 한수를 표시하는 함수인 d를 만들었습니다!
1,2,3 번째 자리를 저장할 변수 a, b, c를 선언해주고
c = i % 10
b = (i % 100) / 10
a = (i % 1000) / 100
각 자리에 맞는 숫자를 위의 식으로 구했습니다!
예를들어 987의 8을 추출하고 싶으면 987%100 = 87, 87/10 = 8 이렇게 추출할 수 있겠죠!
100보다 작은 숫자는 모두 한수이기 때문에 조건을 3가지로 나눌 수 있는데
a>0 일때 (100자리 숫자가 0보다 클때 즉 숫자가 100보다 클때)
그렇지 않을때 (숫자가 100보다 작을때)
i == 1000 일때 (예외처리를 안해주면 마지막 else문에 들어가겠죠)
입력은 1000까지 들어올 수 있지만 선언한 함수에서 4자리 처리를 안해줬기 때문에
따로 처리해줬습니다!
main으로 넘어가서 숫자 N을 입력받고
d(N) <------ 함수에 N을 넣어 실행 시킨 후 (예를들어 함수에 1 을 넣고 싶으면 d(1) 하면 됩니다! )
isHan 이 true면 cnt를 1개씩 증가시키면서 한수의 개수를 찾아냈습니다!
(bool type 에서 true 와 1은 같습니다! 참고로 false == 0 )
함수를 정의하지 않고 더 간단하게 풀 수 있지만 이번 문제는 C++ 함수를 정의하고 사용해야되는 문제이므로
함수를 꼭 만들어보시는 것을 추천드립니다!
C++ 백준 1065 번 이었습니다! 감사합니다~!