1. 문제

0으로 채워진 크기가 N인 배열에 제공되는 A[K] 배열을 값을 순차적으로 아래 두가지 경우를 적용하여 나온 최종값을 리턴.

 1. A[K]의 값이 1보다 크거나 같고, N보다 작거나 같으면 크기가 N인 배열의 A[K] 위치의 값을 1 증가

 2. A[K]의 값이 N+1일 경우 크기가 N인 배열의 최대 값으로 모든 값을 변경



2. 풀이

주어진 N 값으로 N크기의 배열을 생성 후 제공되는 A배열의 크기만큼 반복하여 그 값이 1보다 크거나 같고 N보다 작거나 같을 경우엔 N배열의 해당 위치를 1증가 시키고, N+1일 경우엔 모든 값을 현재 N배열의 최대값으로 채움.

단, N+1일 경우 매번 최대값을 체크하면 Performance에 좋지 않기 때문에 값 대입전 최대값과 비교하도록 함.


public int[] solution(int N, int A[]) {

int[] rdata = new int[N];

int max_num = 0;


for (int i=0; i<A.length; i++) {

if (1 <= A[i] && A[i] <= N) {

max_num = Math.max(++rdata[A[i] - 1], max_num);

} else if (A[i] == N+1) {

Arrays.fill(rdata, max_num);

}

}


return rdata;

}


이렇게 하고 테스트를 진행하였더니 Correctness는 100%이지만 Performance가 77%밖에 안나옴.

역시 중급이라 Performance에 더 신경을 써야함.

Performance를 높이기 위해 N+1일 경우 매번 배열을 채우는 로직을 변경해야 할 것 같아 심히 고민...

고민...

고민... 끝에 N+1일 경우 최대값을 채우지말고 매번 최대값을 기억하여 자기 차례가 됬을 때 최대값보다 작으면 최대값에+1를 하도록 하기로 함.

그런데 이러할 경우 마지막 N+1이후에 값들도 값이 변하게 됨.

더 고민 끝에 현재의 최대값과 이전 마지막 최대값을 따로 두고 최대값은 최대값대로 체크, 실제 값을 증가시킬 때는 마지막 최대값으로 비교 후 증가시킴.

그리고 N+1일 경우에 마지막 최대값을 계속 체크했던 최대값으로 변경해 주면 됨.




3. 결과

Task Score : 100%

Correctness : 100%

Performance : 100%



4. 코드

MaxCounters Code

+ Recent posts