ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [codility] MaxCounters c++
    Coding Test/codility 2022. 4. 10. 09:21
    728x90
    • 문제

    배열 A가 주어진다.

    A의 원소들은 +1 count 되는 배열의 인덱스를 의미한다.

    A[0] = 3   ->  (0, 0, 1, 0, 0)     : 3번째 자리 +1

    A[1] = 4   ->  (0, 0, 1, 1, 0)     : 4번째 자리 +1

    A[2] = 4   ->  (0, 0, 1, 2, 0)     : 4번째 자리 +1  -> 여기서 max count 발생

    A[3] = 6   ->  (2, 2, 2, 2, 2)     : max counters = 6 -> 모든 원소 값을  원소의 최댓값인 2로 설정 

    A[4] = 1   ->  (3, 2, 2, 2, 2)     : 1번째 자리 +1

    A[5] = 4   ->  (3, 2, 2, 3, 2)     : 4번째 자리 +1

    A[6] = 4   ->  (3, 2, 2, 4, 2)     : 4번째 자리 +1

    최종 return 값 = [3,2,2,4,2] 이다.

    • 문제 해결

    33%가 나와다.

    1. max counter는 A배열의 크기라고 생각했다.

    2. max counter가 나오면 countVec의 원소 중 max값을 구하고

    3. countVec의 모든 원소들을 max값으로 채운다.

    첫번째 풀이)

    #include <string>
    #include <algorithm>
    #include <vector>
    #include <numeric>
    
    #include <iostream>
    
    std::vector<int> solution(int N, std::vector<int> &A) {
    
    	std::vector<int> countVec(N, 0);
    
    	for (const auto &it : A) {
    		
    		if (it == A.size()-1) {
    			int nMax = *std::max_element(countVec.begin(), countVec.end());
    			std::fill(countVec.begin(), countVec.end(), nMax);
    		}
    		else {
    			countVec[it - 1] += 1;
    		}
    	}
    	return countVec;
    
    }
    #define MaxCounters  
    
    #ifdef MaxCounters  
    
    int main() {
    
    	std::vector<int> nVec = {3,4,4,6,1,4,4};
    	int N = 5;
    	
    	std::vector<int> result;
    	result = solution(5, nVec);
    
    	for (const auto &it : result) {
    		std::cout << it;
    	}
    
    	return 0;
    }
    #endif

    문제를 잘못해석한거 같다.

    max counter는 A배열의 최댓값이다.

    다시 풀어보자.

    결과는 77% 까지 올라갔다.

     

    두번째 풀이)

    #include <string>
    #include <algorithm>
    #include <vector>
    #include <numeric>
    
    #include <iostream>
    
    std::vector<int> solution(int N, std::vector<int> &A) {
    
    	std::vector<int> countVec(N, 0);
    
    	long maxCount = 0;
    	long maxValue = 0;
    
    	for (const auto &it : A) {
    		
    		if (it > N) {
    			std::fill(countVec.begin(), countVec.end(), maxValue);
    		}
    		else {
    
    			if (countVec[it - 1] < maxCount)
    				countVec[it - 1] = maxCount;
    
    			countVec[it - 1] += 1;
    
    			if (maxValue < countVec[it - 1]) {
    				maxValue = countVec[it - 1];
    			}
    		}
    	}
    	return countVec;
    
    }
    #define MaxCounters  
    
    #ifdef MaxCounters  
    
    int main() {
    
    	std::vector<int> nVec = {3,4,4,6,1,4,4};
    	int N = 5;
    	
    	std::vector<int> result;
    	result = solution(5, nVec);
    
    	for (const auto &it : result) {
    		std::cout << it;
    	}
    
    	return 0;
    }
    #endif
    #include <string>
    #include <algorithm>
    #include <vector>
    #include <numeric>
    
    #include <iostream>
    
    std::vector<int> solution(int N, std::vector<int> &A) {
    
    	std::vector<int> countVec(N, 0);
    	int maxValue = 0;
    
    	for (const auto &it : A) {
    		
    		if (it > N) {
    			std::fill(countVec.begin(), countVec.end(), maxValue);
    		}
    		else {
    			maxValue = std::max(maxValue, ++countVec[it - 1]);
    		}
    	}
    	return countVec;
    }
    #define MaxCounters  
    
    #ifdef MaxCounters  
    
    int main() {
    
    	std::vector<int> nVec = {3,4,4,6,1,4,4};
    	int N = 5;
    	
    	std::vector<int> result;
    	result = solution(5, nVec);
    
    	for (const auto &it : result) {
    		std::cout << it;
    	}
    
    	return 0;
    }
    #endif

    세번째 풀이)

    드디어 100%가 나왔다.

    반복문을 수행할 때 최댓값도 변수에 저장해서 사용하는 방법으로 바꿨다.

     

    #include <string>
    #include <algorithm>
    #include <vector>
    #include <numeric>
    
    #include <iostream>
    
    std::vector<int> solution(int N, std::vector<int> &A) {
    
    	std::vector<int> countVec(N, 0);
    
    	int maxCounterNum = 0;
    	int num = 0, counterIndex = 0, nMax = 0;
    	for (int i = 0; i < A.size(); i++) {
    		num = A[i];
    		counterIndex = num - 1;
    		if (num >= 1 && num <= N) {
    			if (maxCounterNum >= countVec[counterIndex])  //최댓값 검사
    				countVec[counterIndex] = maxCounterNum + 1; //최댓값으로
    			else {
    				countVec[counterIndex] = countVec[counterIndex] + 1; //1증가
    			}
    
    			nMax = std::max(nMax, countVec[counterIndex]);
    		}
    		else if (num == N + 1) {
    			maxCounterNum = nMax;
    		}
    	}
    
    	for (int i = 0; i < countVec.size(); i++) {
    		if (maxCounterNum > 0 && maxCounterNum > countVec[i])
    			countVec[i] = maxCounterNum;
    	}
    
    	return countVec;
    
    }
    #define MaxCounters  
    
    #ifdef MaxCounters  
    
    int main() {
    
    	std::vector<int> nVec = {3,4,4,6,1,4,4};
    	int N = 5;
    	
    	std::vector<int> result;
    	result = solution(5, nVec);
    
    	for (const auto &it : result) {
    		std::cout << it;
    	}
    
    	return 0;
    }
    #endif

     

    728x90

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

    [Codility] GenomicRangeQuery c++  (0) 2022.08.11
    [codility] MaxCounters c++  (0) 2022.04.10
    [codility] PermCheck c++  (0) 2022.04.09
    [codility] FrogRiverOne c++  (0) 2022.04.09
    [codility] TapeEquilibrium c++  (0) 2022.04.09

    댓글

© 2022. code-space ALL RIGHTS RESERVED.