Java 예제: 4자리 특정 암호 찾기
이 예제는 아래 문제를 자바 코드를 사용해 푸는 문제입니다.
1
2
3
4
5
6
7
8
9
10
조건 : 종이와 펜을 사용하지 말것. 즉 수학으로 풀지 말 것
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가 커야 하기 때문입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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)의 자리가 어떤 숫자인지를 구하고 싶다면 i를 10으로 나눈 값에 % 10, 백(100)의 자리를 구하고 싶다면 i를 100으로 나눈 값에 % 10 을 하면 됩니다.
정답은 9137입니다.
This post is licensed under
CC BY 4.0
by the author.