CS/알고리즘

[알고리즘] MaxCounters

hojak99 2017. 4. 24. 01:58

codility 사이트에서 나온 난이도 중간의 알고리즘 문제이다.

문제 이해하기 조금 어려웠던 것도 있어서 이 문제는 예외적으로 블로그에서 설명하려고 한다.


/*
 * 0으로 초기화 되어 있는 N 개의 카운터가 주어지며, 
 * increase(X) 는 해당 카운터 를 1 증가시킨다.
 * max counter 는 모든 카운터를 가장 큰 카운터의 값으로 설정 한다.
 * 
 * 비어있지 않는 M개의 요소를 가진 배열 A가 주어지며
 * 만약 A[K] = X, 1 <= X <= N 이면 increase(X)를 한다.
 * 만약 A[K] = N + 1 이면 max counter 를 한다.
 * 
 * 예를 들어 
 * A[] = {3, 4, 4, 6, 1, 4, 4} , N = 5 일 때,
 * (0, 0, 1, 0, 0)	 이 이유는 인덱스 값 3은 1<=3<=5 에 충족하기 때문에 해당 카운터를 1 증가시킨다.
 * (0, 0, 1, 1, 0)	 이 이유는 인덱스 값 4는 1<=4<=5 에 충족하기 때문이다.
 * (0, 0, 1, 2, 0)	 이 이유는 인덱스 값 4는 1<=4<=5 에 충족하기 때문이다.
 * (2, 2, 2, 2, 2)	 이 이유는 인덱스 값 6에서 N + 1 을 충족하기 때문에 가장 큰 카운터로 다른 카운터를 설정한다.
 * (3, 2, 2, 2, 2)	 이 이유는 인덱스 값 1에서 1<=1<=5 를 충족하기 때문이다.
 * (3, 2, 2, 3, 2)	 이 이유는 인덱스 값 4는 1<=4<=5 에 충족하기 때문이다.
 * (3, 2, 2, 4, 2)	 이 이유는 인덱스 값 4는 1<=4<=5 에 충족하기 때문이다.
 * 
 * [3, 2, 2, 4, 2] 를 반환해야 한다.
 * 
 * 조건 :
 * N 과 M 은 [1...100,000] 범위의 정수
 * 배열 A의 각 요소는 [1..N+1] 범위의 정수
 * 
 * 
 * 풀이 :
 * 우선 위에 설명한 대로 A[i] 값이 1보다 같거나 크고 N보다 같거나 작을 시에 
 * countArr[A[i]-1] 인덱스 값이 만약 max 보다 작으면 그 값이 max + 1로 설정했고 만약 그렇지 않을 시에는
 * countArr[A[i]-1] 인덱스 값을 + 1 하도록 하였다. 그리고 tempMax와 max 를 나눠서 tempMax 가 
 * countArr[A[i]-1] 보다 작으면 그 값으로 tempMax 변수의 값으로 설정하고 만약 A[i] == N+1 일 경우에
 * max = tempMax 로 실질적인 max 값을 설정하였다. 이렇게 tempMax와 max를 나눈 이유는 tempMax 로만 진행할 경우
 * 항상 tempMax의 값으로 카운터가 증가되기 때문에 값이 원하는 대로 나오지 않기 때문이다.
 * 그리고 첫번 째 for 문을 나와서 두번 째 for문이 존재하는 이유는 증가되지 못한 카운터를 위함이다. 
 * */

public class MaxCounters {
	
	public static void main(String[] args) {
		int A[] = {3, 4, 4, 6, 1, 4, 4};
		solution(5, A);
	}
	
	public static int[] solution(int N, int[] A){
		
		int countArr[] = new int[N];
		int tempMax = 0;
		int max = 0;
		
		for(int i=0; i<A.length; ++i){
		
			if(1 <= A[i] && A[i] <= N){
				
				if(countArr[A[i]-1] < max){
					countArr[A[i]-1] = max+1;
				}else{
					++countArr[A[i]-1];
				}
				
				if(tempMax < countArr[A[i]-1]){
					tempMax = countArr[A[i]-1];
				}
				
			}else if(A[i] == (N+1)){
				max = tempMax;
			}
		}
	
		for(int q = 0; q<N; q++){
			if(countArr[q] < max){
				countArr[q] = max;	
			}
		}
		
		for(int i : countArr){
			System.out.print(i + "  ");
		}
		
		return countArr;
	}

}


반응형