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까지로 각각 증가/감소 반복문을 동작시켜 해결했습니다.


,