본문 바로가기
코딩테스트/Codility

[C언어 풀이] Codility - Lessons 2, (Arrays) CyclicRotation

by Hwan2 2019. 2. 19.
728x90
반응형

이 문제는 Codility 사이트에서 확인하고 문제를 풀 수 있습니다.

https://www.codility.com/

 
 
 
 
문제.
 

 

설명.

 

배열(int A[])에 숫자들이 있고 K번 만큼 회전한 결과 값 요소를 제출하세요~ 입니다.

여기서 말하는 회전은 오른쪽으로 쉬프트 한 결과를 말하는 것입니다.

 

즉, A[] = 이렇게 숫자가 들어 있고 3회전을 한다면.

 

0 회전 :

1 회전 :

2 회전 :

3 회전 :

 

이렇게 되고 3회전한 결과 값이 있는 배열 요소를 return 하면 되는 것입니다.

 

만약 5회전이라면 ?? 결과는 0회전과 같은 결과입니다.

6회전 이라면? 1회전과 같은 결과구요.

 

즉, 회전하는 방식(쉬프트)은 같지만, 배열 길이에 따라 여러번 회전 했을 때 결과 값이 달라진다는 뜻입니다.

 
 
 
 

결과.

 

https://app.codility.com/demo/results/trainingN4K788-9SZ/

 

 

 

소스 코드

 

struct Results solution(int A[], int N, int K) {
    struct Results result;
    int i, j=0;
    
    result.N = N;
     
    if(N == 0){
        result.A = A;
        return result;
    }
     
    K %= N;
     
    if(K == 0){
        result.A = A;
        return result;
    }
     
    int * arr = (int *)malloc(N * sizeof(int));
     
    for(i = 0; i < N; i++){
        if((N-K) + j == N){\
            K = N;
            j = 0;
        }
        arr[i] = A[(N-K)+(j++)];
    }

    result.A = arr;
     
    return result;
}​

 

 

우선 이 문제는 C로 풀었을 때 구조체를 return 받고 있습니다.

그리고 Results구조체 안에 있는 int *A 라는 녀석에게 회전이 완료된 배열을 전달해 줘야 하죠.

 

solution(int A[], int N, int K) 의 함수에서 맴버변수의 설명을 하자면

int A[] = 문제로 주어지는 배열.

int N  = 배열의 길이.

int K = 회전 수.

 

저는 풀이를 회전 수가 배열의 길이보다 커지는 경우(배열 길이는 8인데 회전수는 224) 8번이 돌면 0회전과 같음으로 'K %=N'을 사용했습니다.

 

그 후 'int *arr'를 동적할당 받아 회전이 된 값들을 넣어주고 있습니다.

 

여기서 주의해야 할 점은,

전달 요소를 동적으로 만들어 전달 하던지, 아니면 int A[]의 요소를 바꿔서 반환해야 하는 것입니다.

동적으로 만들지 않고 일반 배열로 선언하면 함수가 끝나는 과정에서 배열 변수가 살아짐으로 주의해야 합니다.

 

 

 

 

다른 사람 풀이.

 

struct Results solution(int A[], int N, int K) {
    struct Results result;
    int * arr = (int *)malloc(N * sizeof(int));
    int i;

    for(i = 0; i < N; i++)
        arr[(i+K)%N] = A[i];
         
    result.A = arr;
    result.N = N;
    return result;
}
​

 

 
기가 막힙니다.!!!! 실력차이가 확 느껴졌습니다.!!!
그래도 문제를 풀고 다른사람 풀이를 보면서 많이 배우는 것 같습니다.

여러가지 해결방법과 예외에 발생할 수 있는 문제점들을 잘 고려해서 문제 푸는 습관을 길러야 겠습니다.

 

반응형

댓글


스킨편집 -> html 편집에서