안녕하세요 길벗수험서 운영팀입니다.
[1]
배열 내의 숫자를 특정 순서대로 적어넣어야 하는 경우 각 배열 위치 값들의 변화를 파악하셔야 합니다.
1회전 0,0
2회전 0,1 - 1,0
3회전 0,2 - 1,1 - 2,0
....
이런 식으로 말이죠.
코드에서 앞의 a[j][ ? ] = c 는 배열 북서쪽을, a[n-j][n-(i-j)] = c 는 남동쪽 방향을 채우는 것을 알 수 있습니다. 남동쪽 방향을 채우는 코드를 수행해보면 채워지는 과정을 알 수 있으니까요.
잘 보면 남동쪽 방향을 채우는 코드는 북서쪽의 역방향입니다. 'n-'를 생각해보세요.
1회전 4,4
2회전 4,3 - 3,4
3회전 4,2 - 3,3 - 2,4
이제 뭔가 추측이 되죠.. 배열의 최대 위치값 n-를 통해 역방향으로도 값을 넣고 있기 때문에, n-만 빼고 1번 빈칸에 넣으면 <출력> 과 동일하게 값이 저장되게 됩니다.
2번 빈칸의 경우 자바의 향상된 for문에 해당하는 부분입니다.
이것은 교재 1권 111쪽 문제 2번의 해설을 참고해주세요.
[2]
사용자 정의 함수와, 포인터, 그리고 함수의 합 알고리즘이 함께 응용된 코드입니다.
먼저 사용자정의 함수를 호출함에 있어 포인터를 사용하였으므로, 리턴값이 없어도 같인 포인터 주소를 갖고 있는 포인터 변수로 인해 변수 a의 값이 함께 변화함을 알아두세요.
즉, a = *result = *r은 동일한 값을 가지게 됩니다.
main함수는 단순히 re함수를 호출하고 변수 a를 출력하는 역할을 합니다.
re함수는 i를 2~5까지 회전시키면서 pn함수로 리턴받은 값을 포인터 변수 r이 가리키는 값(*r)에 누적시키죠.
(while 반복문을 보면 1에 진입하여 pn(i)가 수행될 때의 i값은 2~5임을 확인할 수 있습니다.)
pn함수는 교재 1권 188쪽의 알고리즘을 그대로 적용하여 합이 출력되는 부분을 합을 리턴하도록 수정한 것입니다.
즉, pn함수에서
p가 2인 경우 소수 2를 리턴하고,
p가 3인 경우 소수 2, 3의 합을 리턴하고,
p가 4인 경우 소수 2, 3의 합을 리턴하고,
p가 5인 경우 소수 2, 3, 5의 합을 리턴하게 되죠.
다시 re함수에서는 위 결과들의 합을 *r에 저장함에 따라 a의 값이 변화되어 마지막 main()함수에서 a를 출력하게 되면 *r과 동일한 값을 출력하게 되는 것이죠.
행복한 하루되세요 :)
-
관리자2019-04-10 10:26:10
안녕하세요 길벗수험서 운영팀입니다.
[1]
배열 내의 숫자를 특정 순서대로 적어넣어야 하는 경우 각 배열 위치 값들의 변화를 파악하셔야 합니다.
1회전 0,0
2회전 0,1 - 1,0
3회전 0,2 - 1,1 - 2,0
....
이런 식으로 말이죠.
코드에서 앞의 a[j][ ? ] = c 는 배열 북서쪽을, a[n-j][n-(i-j)] = c 는 남동쪽 방향을 채우는 것을 알 수 있습니다. 남동쪽 방향을 채우는 코드를 수행해보면 채워지는 과정을 알 수 있으니까요.
잘 보면 남동쪽 방향을 채우는 코드는 북서쪽의 역방향입니다. 'n-'를 생각해보세요.
1회전 4,4
2회전 4,3 - 3,4
3회전 4,2 - 3,3 - 2,4
이제 뭔가 추측이 되죠.. 배열의 최대 위치값 n-를 통해 역방향으로도 값을 넣고 있기 때문에, n-만 빼고 1번 빈칸에 넣으면 <출력> 과 동일하게 값이 저장되게 됩니다.
2번 빈칸의 경우 자바의 향상된 for문에 해당하는 부분입니다.
이것은 교재 1권 111쪽 문제 2번의 해설을 참고해주세요.
[2]
사용자 정의 함수와, 포인터, 그리고 함수의 합 알고리즘이 함께 응용된 코드입니다.
먼저 사용자정의 함수를 호출함에 있어 포인터를 사용하였으므로, 리턴값이 없어도 같인 포인터 주소를 갖고 있는 포인터 변수로 인해 변수 a의 값이 함께 변화함을 알아두세요.
즉, a = *result = *r은 동일한 값을 가지게 됩니다.
main함수는 단순히 re함수를 호출하고 변수 a를 출력하는 역할을 합니다.
re함수는 i를 2~5까지 회전시키면서 pn함수로 리턴받은 값을 포인터 변수 r이 가리키는 값(*r)에 누적시키죠.
(while 반복문을 보면 1에 진입하여 pn(i)가 수행될 때의 i값은 2~5임을 확인할 수 있습니다.)
pn함수는 교재 1권 188쪽의 알고리즘을 그대로 적용하여 합이 출력되는 부분을 합을 리턴하도록 수정한 것입니다.
즉, pn함수에서
p가 2인 경우 소수 2를 리턴하고,
p가 3인 경우 소수 2, 3의 합을 리턴하고,
p가 4인 경우 소수 2, 3의 합을 리턴하고,
p가 5인 경우 소수 2, 3, 5의 합을 리턴하게 되죠.
다시 re함수에서는 위 결과들의 합을 *r에 저장함에 따라 a의 값이 변화되어 마지막 main()함수에서 a를 출력하게 되면 *r과 동일한 값을 출력하게 되는 것이죠.
행복한 하루되세요 :)