이 예제는 아래 문제를 자바 코드를 사용해 푸는 문제입니다.

조건 : 종이와 펜을 사용하지 말것. 즉 수학으로 풀지 말 것 

4자리 비밀번호 맞추기 
1. 1번째 자리의 수는 4번째 자리의 수보다 2더 크다. 
2. 2번째 자리의 수가 3번째 자리의 수보다 작다. 
3. 4자리 모두 0이 아니다. 
4. 비밀번호 + 비밀번호 뒤집은 수 = 16456 이다. 
예) 1234 + 4321 = 16456 

결과는 답만 나와선 안되고, 답을 구하기까지의 과정이 반영된 코드가 나와야 합니다.

문제가 좀 헷갈리게 나와있는데요, 문제에서 1번째 자리 수는 1000(천)의 자리수를 뜻합니다. 조건에 따라 문제를 풀면 되므로 예제 자체는 어려울 것이 없습니다만, 코드가 길어질 수 있으므로 약간 최적화를 해보겠습니다.

1번째 자리 수는 4번째 자리 수보다 2 크다고 했으므로 1번째 자리 수는 0, 1이 올 수 없다.
☛ 2000부터 시작합니다.

2번째 자리의 수가 3번째 자리의 수보다 작다. 또한 4자리수 모두 0이 아니라고 한다.
☛ 3121부터 시작하며 숫자에  0이 있을 경우 패스(continue)할지를 고려할 수 있습니다. 3121인 이유는 숫자에 0이 올 수 없는데 첫 번째 자리수는 4번째 자리수보다 2가 커야 하기 때문입니다.

public class CodeBreaking {
 
    public static void main(String[] args) {
        
  /*조건 : 종이와 펜을 사용하지 말것. 즉 수학으로 풀지 말 것 
  4자리 비밀번호 맞추기
  1. 1번째 자리의 수는 4번째 자리의 수보다 2더 크다.
  2. 2번째 자리의 수가 3번째 자리의 수보다 작다.
  3. 4자리 모두 0이 아니다.
  4. 비밀번호 + 비밀번호 뒤집은 수 = 16456 이다.
  ex) 1234 + 4321 = 16456
  결과는 답만 나와선 안되고, 답을 구하기까지의 과정이 반영된
  코드가 나와야 합니다.*/
        
        int password = 0;
        
        for(int i = 3121; i <= 9999; i++) {
        	int nDigit = i % 10;
        	int dDigit = (i / 10) % 10;
        	int mDigit = (i / 100) % 10;
        	int kDigit = (i / 1000) % 10;
        	if(nDigit == 0 || dDigit == 0 || mDigit == 0) {
        		continue;
        	}
        	boolean con1 = (kDigit - nDigit == 2);
        	boolean con2 = (dDigit > mDigit);
        	boolean con3 = (i + (nDigit * 1000 + dDigit * 100 + mDigit * 10 + kDigit) == 16456);
        	if(con1 && con2 && con3) {
        		System.out.println("Code has been broken!");
        		System.out.println("\nPassword: " + i);
        		break;
        	}
        	
        }
 
    }
 
}

참고로 정수를 10으로 나머지(%)를 하면 맨 마지막 수를 반환합니다. 이 점을 이용해 십(10)의 자리가 어떤 숫자인지를 구하고 싶다면 i10으로 나눈 값에 % 10, 백(100)의 자리를 구하고 싶다면 i100으로 나눈 값에 % 10 을 하면 됩니다.

정답은 9137입니다.