x에 y를 넣고, y에 x를 넣으면 두 값이 바뀔까요?

동시에 원래 좌표를 교환하는 대칭이동과 저장값을 차례로 덮어쓰는 명령을 구별해요.

두 개의 빈 둥근 접시가 달린 낡은 양팔 저울

사진: Nikodem Nijaki · CC BY-SA 3.0 · 원본 출처

점의 현재 좌표를 두 칸 x,y에 저장해요. 시작은(2,5)입니다. 명령 x←y를 실행한 뒤 y←x를 실행해요. 각 명령은 실행 당시의 오른쪽 값을 왼쪽 칸에 저장해요. 이 두 명령으로 직선 y=x에 대한 대칭점(5,2)을 얻는가?

(x,y)=(2,5),x←y; y←x.(x,y)=(2,5),\qquad x\leftarrow y;\ y\leftarrow x.

교재의 y=x 대칭이동에서는 x와y를 바꿔요. 그 문장을 저장 칸의 덮어쓰기 명령 두 개로 옮길 때는 각 기호가 원래 값인지 이미 바뀐 값인지 확인해야 해요.

(2,5)⟶(5,5)⟶(5,5),(x0,y0)⟼(y0,x0).(2,5)\longrightarrow(5,5)\longrightarrow(5,5),\qquad (x_0,y_0)\longmapsto(y_0,x_0).

명령 두 개의 결과는 일반적으로(y₀,y₀)입니다. 서로 다른 x₀를 가진 점들이 같은 결과로 모이므로 원래 첫 좌표를 복원할 수 없어요. 우연히x₀=y₀였던 점에서는 결과가 맞아 보여도, 그것만으로 올바른 대칭이동이라고 검증할 수 없어요. 대칭이동은 두 번 적용하면 원래 점을 되찾지만 이 명령은 잃은 값을 되찾지 못해요. 제대로 교환하려면 별도 칸z를 마련해 z←x, x←y, y←z 순서로 원래 값을 보존해요.

Craig Barton은 대입할 문자를 괄호 속 값으로 바꾸되 다른 문자를 그대로 두는 단계를 계산과 분리해요. 이 글은 그 구별을 자체 좌표 저장 규칙으로 확장했어요. 원문이 프로그래밍의 좌표 교환 알고리즘을 제시했다고 쓰지는 않아요.

수업에서는 명령 줄마다 현재 두 칸의 값을 기록하게 해요. 교사는 마지막 숫자만 묻는 대신 두 번째 x가 어느 시점의 값인지를 먼저 표시하게 할 수 있어요.

출처·착안: Substituting into an expression. 위 조건·문항·해설은 새로 작성했다.

이 글 공유하기

개인정보 및 방문 통계 안내