이 예제는 아래 문제를 자바 코드를 사용해 푸는 문제입니다.
조건 : 종이와 펜을 사용하지 말것. 즉 수학으로 풀지 말 것 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)의 자리가 어떤 숫자인지를 구하고 싶다면 i
를 10으로 나눈 값에 % 10
, 백(100)의 자리를 구하고 싶다면 i
를 100으로 나눈 값에 % 10
을 하면 됩니다.
정답은 9137입니다.
0개의 댓글