[백준,BOJ 1065] 한수(JAVA 구현)
코테/백준 온라인 저지(BOJ)

[백준,BOJ 1065] 한수(JAVA 구현)

반응형

-해법

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이라는 점을 깨달았다. 이 부분들을 잘 고려해 푼다면 비교적 쉽게 풀 수 있는 문제였다.

 

  

반응형