상세 컨텐츠

본문 제목

< 백준 BaekJoon : 1065번 한수 > C++

C++/Baekjoon

by J2on 2021. 9. 18. 16:50

본문

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. isTruetrue일때 리턴값에 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

관련글 더보기

댓글 영역