단계별 풀기 : 함수
https://www.acmicpc.net/problem/1065
1065번: 한수
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나
www.acmicpc.net
오늘 풀어본 문제는 한수라는 알고리즘 문제다.
문제는 생각보다 간단하다.
100미만의 모든 수는 한수이다.
따라서 우리가 고려해야하는 것은 100 이상의 숫자이다.
지문에서 나온것 처럼 숫자의 각 자리수가 등차 수열을 이룬다면, 한수라고 할 수 있다.
공차는 음수일수도 양수일수도 있다.
따라서 ) 1 2 3 , 1 3 5 , 1 4 7 ... 점점 커지는 수도 한수이다.
그렇다면 우리가 필요한것은 3자리 수의 자연수가 한수인지 확인해 보는 것이다.
아래의 코드를 통해 확인해 보자.
import java.io.*;
class Main{
public static int count = 0;
public static void main (String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
if(N < 100 ){ // 1~99까지의 수는 모두 한수이다.
System.out.println(N);
}else{ // 100부터 한수인지 확인하자.
count = 99; //들어온 수가 100보다 클 경우 기본적으로 99개의 한수를 가지고 있다.
for(int i = 100; i<=N; i++){
if(IsHanNum(i)){ //만약 3자리의 자연수가 한수 일 경우 count 해준다.
count++;
}
}
System.out.println(count);
}
}
public static boolean IsHanNum(int num){
if(num == 1000) return false; //1000은 한수가 아님으로 바로 false값을 반환한다.
int[] valueArray = new int[3]; //3자리의 각 자연수를 넣을 수 있도록 한다.
for(int i = 0; i<3; i++){
valueArray[i] = num%10;
num /=10;
if(num == 0) break; // 십의 자리부터 00일경우 더이상 계산할 필요가 없다.
}
return IsSameSeq(valueArray);
}
public static boolean IsSameSeq(int[] array){
int d = array[0] - array[1];
for(int i=0; i<2; i++){ //만약 자연수가 3자리 이상일 수도 있다면, 2라고 적힌곳을 size라는 변수로 두고 사용한다. 변수는 인자로 받는다.
if(array[i] - array[i+1] != d) return false;
}
return true;
}
}
이 문제는 특별한 알고리즘보다는 함수를 구현하는데 더욱 집중하는 문제이다.