문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음
정수로 된 배열이 주어지고, 두 요소의 차이의 절대값이 같거나 1인 가장 긴 부분 배열을 찾아라.
a = [1, 1, 2, 2, 4, 4, 5, 5, 5]
주어진 기준으로 두 개의 부분배열 [1, 1, 2, 2]와 [4, 4, 5, 5, 5]있다. 가장 긴 부분 배열의 길이는 5개의 요소를 가졌다.
pickingNumbers 함수를 완성해라.
pickingNumbers 함수는 아래와 같은 매개변수를 가지고 있다.
문제를 보고 투 포인터가 생각나서 투 포인터로 풀었다. 다소 억지로 끼워맞춘 형식의 풀이이다.
먼저 매개변수로 넘어오는 배열 a를 정렬을 한다. 정렬을 하면 오름차순이 되기 때문에 문제를 해결하는데 편하다.
a.sort(Comparator.naturalOrder());
그리고 변수 left, nextLeft, right, max를 선언한다.
int left = 0; // 부분 배열에서 작은 값의 index
int nextLeft = left; // 다음 부분 배열에서 시작할 index
int right = 1; // 부분 배열에서 큰 값의 index
int max = 0; // 가장 긴 부분 배열의 길이
while문을 사용해서 right가 배열의 길이를 넘을 때까지 반복한다.
while(right < a.size()){
}
max를 반복문 시작할때 계속 최대값을 비교해서 할당한다.
while(right < a.size()){
max = Math.max(max, right - left);
}
두 요소의 차이의 절대값을 비교한다. 절대값이 1보다 작거나 같을때 right를 증가 시키고 작은 값과 큰 값의 차가 1이 될때 nextLeft의 값을 변경한다. 또 절대값이 1보다 큰 경우 left와 right 값을 변경한다.
while(right < a.size()){
max = Math.max(max, right - left);
if(Math.abs(a.get(left) - a.get(right)) <= 1){
if(Math.abs(a.get(left) - a.get(right)) == 1){
nextLeft = right;
}
right++;
}else if(Math.abs(a.get(left) - a.get(right)) > 1){
left = right;
right = left + 1;
}
}
left가 0부터 시작했다면 max에 1을 더 한다. 이 부분이 억지로 넣은 부분이다. 그리고 max를 반환한다.
if(left == 0){
max += 1;
}
return max;
public static int pickingNumbers(List<Integer> a) {
a.sort(Comparator.naturalOrder());
int left = 0;
int nextLeft = left;
int right = 1;
int max = 0;
while(right < a.size()){
max = Math.max(max, right - left);
if(Math.abs(a.get(left) - a.get(right)) <= 1){
if(Math.abs(a.get(left) - a.get(right)) == 1){
nextLeft = right;
}
right++;
}else if(Math.abs(a.get(left) - a.get(right)) > 1){
left = right;
right = left + 1;
}
}
if(left == 0){
max += 1;
}
return max;
}