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페이지씩 넘기는 버튼을 만든다고 하면 코드는,
→ p씩 좌측 순환시프트
→ p씩 우측 순환시프트
================================================================================