# Array - DS  (array)

[문제]

 

[코드]

int* reverseArray(int a_count, int* a, int* result_count) {
    int temp;
    
    *result_count=a_count; 
    a_count--;
    for(int i = 0; i <= a_count/2; i++){
        temp=a[i];
        a[i]=a[a_count-i];
        a[a_count-i]=temp;
    }
   
    return a;
}

 

[코드설명]

temp: 배열의 값을 옮길 때 임시로 저장할 변수

 

result_count에 a_count 값을 미리 옮겨 놓고, a_count에 마지막 값의 인덱스를 저장하기 위해 a_count를 1감소시켰다.

(a[0], a[n-1]), (a[1], a[n-2]), ...순서쌍의 값이 서로 바뀌도록 하기 위해 for문이 i가 0부터 a_count/2으로 증가될 때까지 반복한다(인덱스의 중간값까지).

temp에 a[i]의 값을 저장해가면서 a[i]와 a[a_count-i]의 값을 서로 바꾼다.

for문 종료 후에 포인터 a를 반환한다.

 

[채점 결과]

 

 

 

 

 

# Equal Stacks  (stack)

[문제]

 

[코드]

int sum(int* arr, int count)
{
    int sum = 0;
    
    for(int i = 0; i < count; i++)
        sum += arr[i];
    return sum;
}

int min_h(int n1, int n2, int n3)
{
    int min = n1;
    min = min < n2 ? min : n2;
    min = min < n3 ? min : n3;
    
    return min;
}
void reverse(int* h, int n)
{
    int temp;
    
    n--;
    for(int i = 0; i <= n/2; i++){
        temp = h[i];
        h[i] = h[n-i];
        h[n-i] = temp;
    }
}

int equalStacks(int h1_count, int* h1, int h2_count, int* h2, int h3_count, int* h3) {
    int n1 = 0, n2 = 0, n3 = 0;
    int min;
    
    n1 = sum(h1, h1_count);
    n2 = sum(h2, h2_count);
    n3 = sum(h3, h3_count);
    min = min_h(n1, n2, n3);
    
    reverse(h1, h1_count);
    reverse(h2, h2_count);
    reverse(h3, h3_count);
    
    while(!(n1==n2&&n2==n3))
    {
        if(n1 > min)
            n1 -= h1[h1_count-1], h1_count--;
        if(n2 > min)
            n2 -= h2[h2_count-1], h2_count--;
        if(n3 > min)
            n3 -= h3[h3_count-1], h3_count--;
        min = min_h(n1, n2, n3);       
    }
    return min;
}

[코드설명]

  ① sum()

sum: 배열 원소의 합

 

i가 0부터 count-1까지 증가하면서 arr[i]의 값을 sum에 더한다.sum을 반환한다.

 

  ② min_h()

min: 세 가지 스택의 sum중 제일 작은 수

n1, n2, n3: 세 가지 스택의 sum

 

min과 스택의 sum을 비교해서 더 작은 수를 min에 저장한다.

min을 반환한다.

 

  ③ reverse()

위쪽의 Array - DS에서 구현한 reverseArray()와 동일한 알고리즘이다.

for문에서 i가 0부터 배열 인덱스의 중간까지 증가하면서 h[i]와 h[n-i]의 값이 서로 바뀐다.

 

  ④ equalStacks()

min: 세 가지 스택의 sum중 제일 작은 수

n1n2n3: 세 가지 스택의 sum

 

sum()로 세 스택의 sum을 구하고, 그 중 제일 작은 수를 min에 저장한다.

/* 필자가 문제를 제대로 이해하지 못한건지, 제일 먼저 push된 수가 먼저 pop되는 것 같이 보였다. stack을 제대로 구현하기 위해서 min을 구하기에 앞서 각 스택의 값을 reverse했다. */

reverse()로 세 스택의 값을 거꾸로 재배치했다.

min과 각 스택의 sum을 비교해서 스택의 sum이 더 크면 sum에서 스택의 마지막 값을 빼고, 인덱스를 감소시킨다.위의 명령을 완료하면 바뀐 각 스택의 sum에 대해서 다시 min을 구한다.이 과정을 n1, n2, n3이 같을 때까지 반복한다.n1=n2=n3이면 min을 반환한다.

 

[채점 결과]

복사했습니다!