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. 코드