티스토리 뷰
배열 A와 숫자 N이 주어지는데, A[K] 값이 1과 N 사이라면 counter의 X 위치를 1 더하고, A[K] 값이 N+1이면 counter의 최대값으로 모든 값들을 세팅해주는 식으로 해서 배열 A를 돌면서 모든 연산을 처리한 결과를 반환하는 문제.
class Solution {
public int[] solution(int N, int[] A) {
int maxVal = 0;
int prevMaxVal = 0;
int[] counter = new int[N];
for (int i = 0; i < A.length; i++) {
if (A[i] == N + 1) { // N+1이면 최대값으로 모든 배열 setting
if (prevMaxVal != maxVal) {
Arrays.fill(counter, maxVal);
prevMaxVal = maxVal;
}
} else { // 아닌 경우 counter에 해당 위치 +1 하기
counter[A[i]-1]++;
maxVal = Math.max(maxVal, counter[A[i]-1]);
}
}
return counter;
}
}
이렇게하면 88점이 나온다,, Arrays.fill의 횟수를 최소한으로 해야할 거 같다.
class Solution {
public int[] solution(int N, int[] A) {
int[] counter = new int[N];
int tmpMaxCounter = 0;
int doneMaxCounter = 0;
for (int i = 0; i < A.length; i++) {
// MAX COUNTER 처리 여부
if (A[i] > N) {
// 일단 한 걸로 치고 그 값을 담아둔 뒤
doneMaxCounter = tmpMaxCounter;
} else {
// 연산하기 전에 maxCount를 보고 작으면 maxCount로 세팅 먼저해준다
if (counter[A[i] - 1] < doneMaxCounter) {
counter[A[i] - 1] = doneMaxCounter;
}
// 매번 최대값을 저장
tmpMaxCounter = Math.max(tmpMaxCounter, ++counter[A[i] - 1]);
}
}
if (doneMaxCounter > 0) {
for (int i = 0; i < counter.length; i++) {
// doneMaxCounter보다 작은 애들은 그 값으로 세팅
if (counter[i] < doneMaxCounter) {
counter[i] = doneMaxCounter;
}
}
}
return counter;
}
}
다른 풀이를 참고해서 위와 같이 해결했다.
Arrays.fill 연산 (max counter) 이 아무래도 모든 배열을 다 돌면서 처리하는 방식이라 시간이 많이 걸려서 마지막에 한번 수행하는 식으로 풀어냈다.
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- non-blocking
- 코딩테스트 고득점 Kit
- http://www.nextree.co.kr/p6960/
- 핸들러 인터셉터
- 블로킹
- 논블로킹
- Synchronous
- 프로그래머스 Level 2
- 인터셉터
- Filter
- 프로그래머스 Level 1
- a
- 필터
- 프로그래머스 Level 3
- blocking
- 프로그래머스
- 비동기
- 스택/큐
- 동기
- 해시
- Handler Interceptor
- Asynchronous
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함