본문 바로가기

c언어 스터디/HackerRank

[HackerRank] Left Rotation

Left Rotation | HackerRank

 

Left Rotation | HackerRank

Given an array and a number, d, perform d left rotations on the array.

www.hackerrank.com

 

<문제>

input: 첫번째 줄에 첫번째 값은 배열의 크기, 두번째 값은 rotation 횟수 d를 입력받는다. 

두번째 줄에는 배열 arr을 입력받는다.

 

output: d번 왼쪽으로 이동시킨 배열의 결과를 출력한다. 

 

 

<코드>

int* rotateLeft(int d, int arr_count, int* arr, int* result_count)
{
    d = d%arr_count;
    *result_count = arr_count;
    
    while(d!=0)
    {
        int arr_first = arr[0];
        for(int i =0 ;i< arr_count;i++)
        {
            arr[i] = arr[i+1];

        }
        arr[arr_count-1] = arr_first;
        d--;
    }
    return arr;
}

 

<풀이>

처음에는 arr배열과 같은 크기의 배열 arr_temp를 선언하고, 배열의 크기만큼 arr[j]에 arr_temp[j+1]을 대입하는 것을 반복하고 다시 arr_temp와 arr 배열을 복사한 뒤에야 d값을 반복시켰는데, 이렇게 코드를 돌리니 for 문 내부에 for문이 2개나 있어 시간초과문제가 발생했다. 

그래서 arr_temp 배열을 선언하지 않고, arr배열의 인덱스 0 원소를 arr_first 변수에 저장하고, for 문을 통해 arr[i]=arr[i+1]을 하여 한 칸씩 왼쪽으로 보냈다. for문이 끝난 뒤 arr배열의 마지막에 arr_first값을 넣고 d값을 하나 감소시켜 d가 0이 될 때까지 반복했다. 

이를 통해 문제를 풀 수 있었다.

 

<실행결과>

'c언어 스터디 > HackerRank' 카테고리의 다른 글

[HackerRank] Repeated String  (0) 2021.08.14
[HackerRank] Equalize the Array  (0) 2021.08.05
[HackerRank] Drawing Book  (0) 2021.07.27
[HackerRank] Utopian Tree  (0) 2021.07.27
[HackerRank] Print in Reverse  (0) 2021.07.27