-
% 연산을 사용하는 이유, 활용법코딩테스트 2024. 8. 22. 16:01반응형
원형 배열에서
%
연산을 사용하는 이유와 그 작동 방식을 좀 더 자세히 설명해 보겠습니다.1. 원형 배열의 개념
원형 배열은 배열의 마지막 요소가 다시 첫 번째 요소와 연결되는 구조를 의미합니다. 예를 들어, 배열
[1, 2, 3, 4, 5]
가 있다고 할 때, 5 다음에 다시 1로 돌아갑니다. 즉, 배열의 끝과 시작이 연결된 상태라고 생각할 수 있습니다.2. 인덱스를 통해 원소에 접근하기
일반적인 배열에서는 인덱스를 사용하여 요소에 접근할 수 있습니다. 예를 들어, 배열
[1, 2, 3, 4, 5]
에서 인덱스 0은 1, 인덱스 1은 2에 해당합니다.하지만 원형 배열에서는 마지막 요소 다음에 다시 첫 번째 요소로 돌아가야 하기 때문에, 단순히 인덱스를 증가시키는 방식으로는 순환 구조를 구현할 수 없습니다.
3. % 연산을 통한 순환 구현
이 문제를 해결하기 위해
%
연산을 사용합니다.%
연산은 나머지 연산으로, 두 숫자를 나누었을 때의 나머지를 구합니다. 이 연산을 사용하면 배열의 끝에 도달했을 때 다시 처음으로 돌아가도록 할 수 있습니다.예시:
- 예를 들어, 배열의 길이가 5인 경우, 인덱스는 0에서 4까지 있습니다.
- 만약 현재 인덱스가 3이고,
k=2
라면, 다음으로 제거할 인덱스는(3 + 2 - 1) = 4
입니다. 여기서는 그냥4
로 접근하면 되지만, 만약k=3
이었다면(3 + 3 - 1) = 5
가 됩니다. 인덱스5
는 배열의 범위를 벗어나므로, 다시 처음으로 돌아가야 합니다.
이때,
% people.count
를 사용하면5 % 5 = 0
이 되어 인덱스0
으로 돌아갑니다.일반적인 공식:
index = (index + k - 1) % people.count
이 공식은 다음을 의미합니다:
index
는 현재 위치를 나타냅니다.(index + k - 1)
는 현재 위치에서k-1
만큼 이동한 위치를 나타냅니다.% people.count
는 이 위치가 배열의 끝을 넘어갔을 때, 다시 배열의 처음으로 돌아가도록 인덱스를 조정합니다.
4. 구체적인 예제
예제 배열:
[1, 2, 3, 4, 5]
- 초기 상태: 인덱스
index = 0
,k = 3
- 첫 번째 이동:
index = (0 + 3 - 1) % 5 = 2
(인덱스 2는 요소3
을 가리킵니다) - 배열 상태:
[1, 2, 4, 5]
- 다음 이동:
index = (2 + 3 - 1) % 4 = 4 % 4 = 0
(인덱스 0은 요소1
을 가리킵니다) - 배열 상태:
[2, 4, 5]
- 계속해서 이 방식으로 진행됩니다.
5. % 연산의 중요성
만약
%
연산을 사용하지 않는다면, 인덱스가 배열의 범위를 초과할 경우 올바른 위치를 계산할 수 없습니다. 따라서,%
연산은 원형 배열에서 배열의 범위를 넘는 인덱스를 올바르게 조정해 주는 역할을 합니다.이렇게
%
연산을 사용함으로써, 배열의 끝에 도달했을 때 자연스럽게 다시 배열의 처음으로 돌아가도록 할 수 있습니다. 이 방식은 원형 구조를 구현할 때 매우 유용합니다.% 연산 사용 예시
%
연산이 유사하게 사용되는 상황이나 문제들은 꽤 많이 있습니다. 몇 가지 예시를 통해 설명해드리겠습니다.1. 시간 계산
- 문제: 현재 시간이
22:00
(10 PM)이고, 5시간 후의 시간을 구하고 싶습니다. 단, 시간은 24시간제로 표현됩니다. - 풀이:
22 + 5 = 27
이지만, 27은 24시간제를 넘기 때문에 24로 나눈 나머지를 구합니다. - 계산:
27 % 24 = 3
이므로, 5시간 후의 시간은03:00
(3 AM)입니다.
2. 원형 큐(Circular Queue)
- 문제: 원형 큐에서 데이터를 삽입하거나 제거할 때, 큐의 끝에 도달했을 때 다시 처음으로 돌아가야 합니다.
- 풀이: 큐의 인덱스가 큐의 크기를 초과할 때,
%
연산을 통해 인덱스를 0으로 되돌립니다. - 계산:
nextIndex = (currentIndex + 1) % queueSize
- 예시: 큐의 크기가 5이고, 현재 인덱스가 4라면, 다음 인덱스는
(4 + 1) % 5 = 0
이 됩니다.
3. 라운드 로빈 스케줄링(Round Robin Scheduling)
- 문제: 프로세스가 여러 개 있을 때, 각 프로세스에 동일한 시간을 할당하며 순차적으로 실행해야 합니다.
- 풀이: 프로세스의 인덱스를 순차적으로 증가시키되, 마지막 프로세스 이후에는 다시 처음 프로세스로 돌아가야 합니다.
- 계산:
currentProcess = (currentProcess + 1) % totalProcesses
- 예시: 4개의 프로세스(0, 1, 2, 3)에서 프로세스 3을 실행한 후 다음 프로세스를 실행하려면
(3 + 1) % 4 = 0
이 되어 프로세스 0으로 돌아갑니다.
4. 배열에서 순환적인 접근
- 문제: 주어진 배열에서 인덱스를 초과하는 범위에서 접근하려 할 때, 순환적으로 인덱스를 사용해야 합니다.
- 풀이: 인덱스를 직접 증가시키는 대신
%
연산을 사용하여 배열의 범위를 초과할 때 처음으로 돌아가도록 만듭니다. - 계산:
index = (index + step) % arraySize
- 예시: 배열
[A, B, C, D]
에서 인덱스 2(C)에서 3단계 앞으로 이동하면(2 + 3) % 4 = 1
이 되어B
를 가리키게 됩니다.
5. 기본적인 게임 개발에서의 맵 순환
- 문제: 2D 맵에서 캐릭터가 오른쪽으로 계속 이동할 때, 맵의 끝에 도달하면 왼쪽 끝으로 이동해야 합니다.
- 풀이: 캐릭터의 위치를 표현하는 x 좌표가 맵의 폭을 초과할 때, 다시 0으로 돌아가도록
%
연산을 사용합니다. - 계산:
x = (x + moveStep) % mapWidth
- 예시: 맵의 폭이 10이고, 현재 x 좌표가 9일 때, 2칸 이동하면
(9 + 2) % 10 = 1
이 되어 캐릭터는 맵의 왼쪽 끝으로 이동합니다.
6. 기본적인 회전 애니메이션
- 문제: 시계가 시침이 360도 회전한 후 다시 원점으로 돌아가는 것처럼, 각도를 표현할 때 0~360도 사이로 제한해야 합니다.
- 풀이: 각도가 360도를 넘었을 때,
%
연산을 통해 각도를 0부터 다시 시작하도록 만듭니다. - 계산:
angle = (angle + rotation) % 360
- 예시: 현재 각도가 350도이고, 20도 더 회전시키면
(350 + 20) % 360 = 10
이 되어 10도로 돌아갑니다.
이와 같은 사례들은
%
연산이 유용하게 사용되는 다양한 상황을 보여줍니다. 이 연산은 주기적, 순환적 패턴을 처리할 때 매우 유용하며, 배열의 경계를 넘나드는 문제를 해결할 때 주로 사용됩니다.반응형'코딩테스트' 카테고리의 다른 글
백준 11866 요세푸스 문제 Swift (0) 2024.08.22