ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Codility] NumberSolitaire c++
    Coding Test/codility 2022. 9. 16. 19:19
    728x90
    • 문제

    N개의 연속된 정사각형으로 구성된 보드에서 게임이 진행된다.

    0번 정사각형의 조약돌을 N-1 정사각형으로 이동시켜야 하는 게임이다.

    각 차례마다, 주사위를 던지고 주사위 윗면의 숫자 K를 고려한다. 

    그런 다음 현재 I에 서 있는 조약돌을  I + K로 이동시킨다.

     I + K가 존재하지 않으면 유효한 인덱스를 얻을 때까지 주사위를 다시 던진다.

    게임이 끝난 후(조약돌이 N-1 로 이동했을 때), 이동한 모든 사각형에 쓰여진 숫자의 합을 구한다. 

     

    결론, A[0] → A[N-1] 로 이동할 때의 배열 원소의 최대 합을 구하는 문제이다.

     

     

    문제 해결

    int solution(vector<int> &A) { 
        vector<int> temp(A.size(), -1);
        temp[0] =  A[0];
        for(unsigned int i = 1;i< A.size();i++)
        {
            int j =  i<6? 0: (i- 6);
           auto itr = std::max_element(temp.begin() + j, temp.begin() + i);
           temp[i] = (*itr +  A[i]);
            
        }
        return temp[A.size() - 1];
    }

     

    예제 )

    위의 코드로 아래와 같은 식이 나온다.

    vector<int> A = { 1, -2, 0, 9, -1, 2 } 일 때

    j i iter A[i] *iter + A[i]
    0 1 1 -2 -1
    0 2 1 0 1
    0 3 1 9 10
    0 4 10 -1 9
    0 5 10 2 12

     

    A 벡터의 0번 부터 1 ~ 5번을 차례로 비교한다.

    1회차 : temp[1] = A[0] ~ A[1] 중 가장 큰 원소 + A[1]

    2회차 : temp[2] = A[0] ~ A[2] 중 가장 큰 원소 + A[2]

    3회차 : temp[3] = A[0] ~ A[3] 중 가장 큰 원소 + A[3]

    4회차 : temp[4] = A[0] ~ A[4] 중 가장 큰 원소 + A[4]

    5회차 : temp[5] = A[0] ~ A[5] 중 가장 큰 원소 + A[5]

     

    temp의 마지막 원소가 이동할 때의 최댓값이 저장되어 있다.

    728x90

    'Coding Test > codility' 카테고리의 다른 글

    [codility] MinAbsSum c++  (2) 2022.09.23
    [Codility] GenomicRangeQuery c++  (0) 2022.08.11
    [codility] MaxCounters c++  (0) 2022.04.10
    [codility] MaxCounters c++  (0) 2022.04.10
    [codility] PermCheck c++  (0) 2022.04.09

    댓글

© 2022. code-space ALL RIGHTS RESERVED.