3개의 한자리 숫자를 더한 값이 15가 될 때, 3개의 숫자를 모두 구하라
3개의 한자리 숫자를 더한 값이 15가 될 때, 3개의 숫자를 모두 구하라.(a+b+c=15일 때, a,b,c값은 ?)
9-1. 해법 정리
1) 정수형 변수 a,b,c를 0으로 초기화
2) a를 0부터 9까지 반복
3) 2) 반복문 안에서 b를 0부터 9까지 반복
4) 3) 반복문 안에서 c를 9부터 0까지 반복
5) 4) 반복문 안에서 a+b+c가 15가 되면 결과값 표시
9-2. 풀이 과정
먼저 수학적 방법으로 접근해서 해결 방법을 알아 보려고 합니다.
손으로 풀어 보니, a가 0(a의 값을 고정)일 때 ‘b와 c의 값은 어떻게 되는가?’를 아는 것이 중요하다는 결론을 내렸습니다. 왜냐하면 a가 취할 수 있는 범위가 0부터 9까지이기 때문에(1자리 숫자라는 제약) 그 점을 이용하면 b와 c를 금방 구할 수 있겠다는 생각을 했기 때문입니다.
예를 들어서,
a가 0일 때, (6,9), (7,8), (8,7), (9,6)의 4가지 방법이 도출됨
이 경우, ‘b와 c의 값은 어떻게 해서 뽑아낼 것인가?’를 아는 것이 문제 해결의 핵심이라고 느껴지더군요. 일단 b의 값을 6에서 9까지, c의 값을 9에서 0까지 반복하는 구문을 동작시켜 어떤 결과가 나오는지 테스트 해 보았습니다.
<사진 설명> 위 스크린샷에 나오는 것처럼, a를 0이라고 가정했을 때의 b와 c값(6,9), (7,8), (8,7), (9,6) 을 빼낼 수 있었습니다.
그리고 범위를 좀 더 확장시켜 a의 반복문(0부터 9까지)을 추가해 보았습니다. 도중에 b와 c를 각각 0~9의 범위로 바꾸어 반복시켰더니, 문제 해결에 가까워 졌습니다.
결국 아래와 같은 결과를 얻기에 이르렀습니다.
<사진 설명> 위의 스크린샷은 풀이 과정에서 나온 결과일 뿐, 정돈되지 않았습니다.
9-3. 소스 코드(PlusFifteen.java)
9-4. 실행 화면
<사진 설명> 9-2(풀이 과정)의 마지막 나오는 스크린샷과 군더더기(사용하지 않는 변수들)를 없애고, 몇 번째 횟수인지 표시했습니다.
결과 화면 계속 보기:
1번째 A=0 B=6 C=9 / A+B+C=15
2번째 A=0 B=7 C=8 / A+B+C=15
3번째 A=0 B=8 C=7 / A+B+C=15
4번째 A=0 B=9 C=6 / A+B+C=15
5번째 A=1 B=5 C=9 / A+B+C=15
6번째 A=1 B=6 C=8 / A+B+C=15
7번째 A=1 B=7 C=7 / A+B+C=15
8번째 A=1 B=8 C=6 / A+B+C=15
9번째 A=1 B=9 C=5 / A+B+C=15
10번째 A=2 B=4 C=9 / A+B+C=15
11번째 A=2 B=5 C=8 / A+B+C=15
12번째 A=2 B=6 C=7 / A+B+C=15
13번째 A=2 B=7 C=6 / A+B+C=15
14번째 A=2 B=8 C=5 / A+B+C=15
15번째 A=2 B=9 C=4 / A+B+C=15
16번째 A=3 B=3 C=9 / A+B+C=15
17번째 A=3 B=4 C=8 / A+B+C=15
18번째 A=3 B=5 C=7 / A+B+C=15
19번째 A=3 B=6 C=6 / A+B+C=15
20번째 A=3 B=7 C=5 / A+B+C=15
21번째 A=3 B=8 C=4 / A+B+C=15
22번째 A=3 B=9 C=3 / A+B+C=15
23번째 A=4 B=2 C=9 / A+B+C=15
24번째 A=4 B=3 C=8 / A+B+C=15
25번째 A=4 B=4 C=7 / A+B+C=15
26번째 A=4 B=5 C=6 / A+B+C=15
27번째 A=4 B=6 C=5 / A+B+C=15
28번째 A=4 B=7 C=4 / A+B+C=15
29번째 A=4 B=8 C=3 / A+B+C=15
30번째 A=4 B=9 C=2 / A+B+C=15
31번째 A=5 B=1 C=9 / A+B+C=15
32번째 A=5 B=2 C=8 / A+B+C=15
33번째 A=5 B=3 C=7 / A+B+C=15
34번째 A=5 B=4 C=6 / A+B+C=15
35번째 A=5 B=5 C=5 / A+B+C=15
36번째 A=5 B=6 C=4 / A+B+C=15
37번째 A=5 B=7 C=3 / A+B+C=15
38번째 A=5 B=8 C=2 / A+B+C=15
39번째 A=5 B=9 C=1 / A+B+C=15
40번째 A=6 B=0 C=9 / A+B+C=15
41번째 A=6 B=1 C=8 / A+B+C=15
42번째 A=6 B=2 C=7 / A+B+C=15
43번째 A=6 B=3 C=6 / A+B+C=15
44번째 A=6 B=4 C=5 / A+B+C=15
45번째 A=6 B=5 C=4 / A+B+C=15
46번째 A=6 B=6 C=3 / A+B+C=15
47번째 A=6 B=7 C=2 / A+B+C=15
48번째 A=6 B=8 C=1 / A+B+C=15
49번째 A=6 B=9 C=0 / A+B+C=15
50번째 A=7 B=0 C=8 / A+B+C=15
51번째 A=7 B=1 C=7 / A+B+C=15
52번째 A=7 B=2 C=6 / A+B+C=15
53번째 A=7 B=3 C=5 / A+B+C=15
54번째 A=7 B=4 C=4 / A+B+C=15
55번째 A=7 B=5 C=3 / A+B+C=15
56번째 A=7 B=6 C=2 / A+B+C=15
57번째 A=7 B=7 C=1 / A+B+C=15
58번째 A=7 B=8 C=0 / A+B+C=15
59번째 A=8 B=0 C=7 / A+B+C=15
60번째 A=8 B=1 C=6 / A+B+C=15
61번째 A=8 B=2 C=5 / A+B+C=15
62번째 A=8 B=3 C=4 / A+B+C=15
63번째 A=8 B=4 C=3 / A+B+C=15
64번째 A=8 B=5 C=2 / A+B+C=15
65번째 A=8 B=6 C=1 / A+B+C=15
66번째 A=8 B=7 C=0 / A+B+C=15
67번째 A=9 B=0 C=6 / A+B+C=15
68번째 A=9 B=1 C=5 / A+B+C=15
69번째 A=9 B=2 C=4 / A+B+C=15
70번째 A=9 B=3 C=3 / A+B+C=15
71번째 A=9 B=4 C=2 / A+B+C=15
72번째 A=9 B=5 C=1 / A+B+C=15
73번째 A=9 B=6 C=0 / A+B+C=15
9-5. 시행 착오
작업에 들어간 지 얼마 되지 않아, 첫 for문에서 for(b=6,b>10;b++)으로 잘못 썼더니 Console창(결과 화면)에 아무런 결과가 나오지 않더군요. 그래서 무엇 때문에 결과가 표시되지 않는지 궁리하다가, b>10에서 부호의 위치를 b<10으로 바꿔서 오류를 피할 수 있었습니다.
그리고 제작 당시 b의 값을 6에서 9까지, c의 값을 9에서 0으로(제가 임의로 테스트 해 본 방법) 이중 반복문을 돌려서 가능 여부를 판별했습니다. 범위를 좀 더 확장해서 a를 0에서 9까지 증가시키는 반복문을 바깥에 하나 더 삽입을 했는데, 아래와 같이 큰 문제 없이 동작하는 것을 보고 ‘완성된 것 아닌가’하는 착각에 빠졌습니다.
그런데 조금 더 살펴 보니 a가 0일 경우는 맞아 들어가지만 a가 1일 경우 b,c의 값이 수학적으로(손으로) 풀었을 때 보다 적게 나오는 것을 확인할 수 있었습니다.
<사진> a의 증가에 따른 b와 c의 값이 제한적(정답과는 다름)으로 나오는 것을 확인할 수 있었습니다. a 의 값에 따라 b와 c의 값이 4가지씩 밖에 나오지 않았던 것이지요.
이 사실을 확인하자 마자 수정에 들어가서 b를 0~9까지, c를 9~0까지로 각각 증가/감소 반복문을 동작시켜 해결했습니다.
'프로그래밍 실습 > 자바(Java)' 카테고리의 다른 글
다음 5명 학생들의 점수를 합산하고 평균과 석차를 구하여 출력하는 프로그램을 작성하라 (1) | 2010.05.13 |
---|---|
다음 다이어몬드 모양과 같이 출력되는 프로그램을 작성하라. (0) | 2010.05.13 |
InputStreamReader 사용하기 (0) | 2009.10.07 |
InputStream 사용하기 (0) | 2009.10.07 |
난수 생성하기 (0) | 2009.10.07 |