https://www.acmicpc.net/problem/1065
1065번: 한수
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나
www.acmicpc.net
1065번 문제 한수
실력이 없는 나에게는 너무 어려운 문제였다.
두시간 짜리 사지방 연등 시간을 이틀이나 쏟아부어 겨우 풀었다.
이 문제를 풀기위해 가장 먼저 생각해야 할것은 100이하의 수는 모두 한수라는 것이다.
FindFunc함수에서는 100과 입력받은 숫자 사이의 한수를 찾을때마다 리턴값을 99에서 1씩 더해준다.
그 과정에서 100부터 입력받은 숫자까지 반복문을 사용하여 각 숫자들이 한수인지 아닌지 판별한다
한수 판별과정
1. 각 숫자를 자릿수마다 나누어 numList에 각각 넣어준다. Ex) 134 → [1] [3] [4]
2. 각 자릿수의 차이가 같은지 확인하여 같으면 Bool 변수인 isTrue → true / 다르면 isTrue → false
3. isTrue가 true일때 리턴값에 1을 더해줌.
<< Code >>
#include <iostream>
using namespace std;
int FindFunc(int num){
if (num < 100) {
return num; // 100보다 작은 수의 경우 모두 한수이기 때문
}
int result = 99;
for (int i = 100; i <= num; ++i){
int share = 0; // List의 크기 알기위해 자릿수를 구함
int temp = i;
while(temp > 0) {
share++;
temp /= 10;
} // 자릿수를 구하는 과정
int* numList = new int[share]; // 자리마다 쪼개서 넣어줄 리스트 생성
temp = i;
for(int j = 0; j <= share; ++j) { // 각 자리마다 쪼개서 동적배열에 넣어줌
numList[j] = temp % 10;
temp /= 10;
}
bool isTrue= true; //한수가 아니라면 false로 바뀌는 변수
for (int k =0; k < share-2; ++k) {
if (numList[k]-numList[k+1] != numList[k+1]-numList[k+2]){
isTrue = false;
}
else {continue;}
}
if (isTrue == true){
result++;
}
//확인을 위한 코드
//cout << "T/F: " << isTrue << "\nNum: "<<i <<"\n";
delete[] numList;
}
return result;
}
int main(){
int num;
cin >> num;
cout << FindFunc(num) << "\n";
}
<< 내 GitHub >>
https://github.com/J2on/BaekjoonOnlineJudge/blob/master/Code/BaekJoon_1065.cpp
< 백준 BaekJoon : 4344번 평균은 넘겠지 > C++ (0) | 2021.09.25 |
---|---|
< 백준 BaekJoon : 8958번 OX퀴즈 > C++ (0) | 2021.09.25 |
< 백준 BaekJoon : 3052번 나머지 > C++ (0) | 2021.09.19 |
< 백준 BaekJoon : 1546번 평균 > C++ (0) | 2021.09.19 |
< 백준 BaekJoon : 2577번 숫자의 개수 > C++ (0) | 2021.09.19 |
댓글 영역