1페이지부터 5페이지까지 5개의 장면이 있고

다음 버튼과 이전 버튼이 있어서 페이지를 넘길 수 있는 프로그램을 만드는데

if문을 쓰지 않고 모듈러연산으로 처리하는 것이 생각나서 식을 구해보기로 했다.


아래 그림은 1부터 n까지의 자연수가 있을때

아무것도 더하지 않고 mod n연산을 하여 +1을 한 결과와,

처음에 1을 더한 경우, 2를 더한 경우에 대한 내용이다.


아래 그림은 처음에 n-2을 더한 경우와, n-1을 더한 경우이다. 

예를 들어 자연수의 집합 {1, 2, 3, 4, 5} 가 있을 때

집합의 각 원소에 n-2인 3을 더하면  집합은{4, 5, 6, 7, 8}가 되고 

이 집합의 mod 5를 구하면 {4, 0, 1, 2, 3} 이 되어

다시 이 집합에 +1을 하면 {5, 1, 2, 3, 4}가 되어서

최종적으로는 원래 집합이 우측으로 1칸씩 순환 이동하였다고 볼 수 있다.

또한 2는 1이 되고, 3은 2가 되고, 4는 3이 되고, 5는 4가 되고, 1은 다시 5가 되었으므로

처음에 만들고자 하였던 프로그램의 이전 버튼에 사용할 수 있을 것이다.


다시 위의 두 그림을 자세히 살펴보면,

집합의 원소 a가 있고 집합의 원소가 n개인 경우에, 이 집합의 원소를 p씩 증가시키고 싶을 때

(예를 들어 각각의 1,2,3,4,5 페이지에서 다음버튼을 눌러서 각각 2,3,4,5,1 페이지를 만들고자 하는 경우 등) 

다음과 같은 함수를 얻을 수 있다.

f(a,p,n) = (a+(p-1))% n +1

여기서 p는 좌측으로 p칸 순환시프트시킬 값도 된다.


처음의 프로그램 문제로 되돌아가서

5페이지일때의 다음버튼을 만든다고 하면 아래와 같이 프로그램을 작성할 수 있을 것이다.

page = (currentPage+(1-1))%5 + 1;

필요없는 연산을 제거하면,

page = currentPage%5 + 1;


이번에는 2페이지씩 넘기는 버튼을 만든다고 하면 코드는,

page = (currentPage+(2-1))%5 + 1; 에서 역시 필요없는 부분을 제거하여
page = (currentPage+1)%5 + 1;
이 된다.

그러면 반대방향으로 1페이지를 넘기는 이전버튼에 들어갈 코드는 어떻게 될까?
순환 시프트이므로 p값을 넣을 자리에 n-p값을 놓으면 된다.
page = (currentPage+(5-1-1))%5 + 1; 
page = (currentPage+3)%5 + 1; 


정리 :
(a+(p-1))% n +1
→ p씩 순환증가
→ p씩 좌측 순환시프트 

(a+(n-p-1))% n +1
→ p씩 순환감소
→ p씩 우측 순환시프트 



================================================================================



+ Recent posts