ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • % 연산을 사용하는 이유, 활용법
    코딩테스트 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
You can do everything.