반응형
-해법
import java.util.Scanner;
public class Main {
static boolean han(int n){ // 한수 판별을 위한 메소드
if(n<100) { // 1~99는 연속된 두 개의 수 차이가 없기 때문에 한수로 인정된다.
return true; // 한수이기 때문에 true 리턴
}
String result = String.valueOf(n); // 정수의 자리수를 살펴보기 위해 문자열로 변환
int arr[] = new int[result.length()-1]; // 자리수들의 차이를 저장할 배열
for(int i=0;i<result.length()-1;i++) { // 문자열로 변환된 정수의 각 자리수 차이를 배열에 저장하는 반복문
arr[i] = (result.charAt(i)-'0')-(result.charAt(i+1)-'0');
}
for(int i=0;i<arr.length-1;i++) { // 자리수들의 차이를 비교하는 반복문
if(arr[i] != arr[i+1]) { // 차이가 다르면 한수가 아니므로
return false; // false 리턴
}
}
return true; // 위 반복문에서 리턴되지 않았다면 한수이므로 true 리턴
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int cnt = 0; // 한수의 개수
for(int i =1;i<=n;i++) { // 1부터 n까지 반복하는 반복문
if(han(i)==true) cnt++; // true를 리턴받으면 한수이므로 cnt++
}
System.out.println(cnt); // 개수 출력
in.close();
}
}
이 문제는 1~99가 한수로 인정되는 사실 여부를 알고 있어야 풀 수 있다고 생각한다. 필자도 검색으로 알았다. 결국 고려해야 하는 범위는 100 ~ 1000까지이지만, 4자리 수 인 1000이 존재할 수 있으므로 자릿수를 고정한 풀이법은 적용할 수 없다. 그렇기 때문에 필자는 전달받은 정수를 문자열로 변환하여 각 자릿수 사이의 차이를 배열에 저장하였고, 배열에 저장된 값들을 비교해 동일한 경우만 한수로 판단하는 식의 풀이로 접근하였다.
또한 처음 접근에 101과 같은 경우 각 자릿수의 차이를 절댓값으로 생각하여 1,1로 한수라고 생각하였지만, 다시 생각해보니 -1,1이라는 점을 깨달았다. 이 부분들을 잘 고려해 푼다면 비교적 쉽게 풀 수 있는 문제였다.
반응형