[HackerRank] Picking Numbers

아르당·2023년 11월 3일
0

HackerRank

목록 보기
8/109
post-thumbnail

문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음

문제

정수로 된 배열이 주어지고, 두 요소의 차이의 절대값이 같거나 1인 가장 긴 부분 배열을 찾아라.

Example

a = [1, 1, 2, 2, 4, 4, 5, 5, 5]

주어진 기준으로 두 개의 부분배열 [1, 1, 2, 2]와 [4, 4, 5, 5, 5]있다. 가장 긴 부분 배열의 길이는 5개의 요소를 가졌다.

Function Description

pickingNumbers 함수를 완성해라.
pickingNumbers 함수는 아래와 같은 매개변수를 가지고 있다.

  • int a[n]: 정수의 배열

Return

  • int: 주어진 기준에 맞는 가장 긴 부분 배열의 길이

Constraints

  • 2 <= n <= 100
  • 0 < a[i] < 100
  • 결과는 항상 2 이상이다.

풀이

문제를 보고 투 포인터가 생각나서 투 포인터로 풀었다. 다소 억지로 끼워맞춘 형식의 풀이이다.

먼저 매개변수로 넘어오는 배열 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;
}
profile
내 마음대로 코드 작성하는 세상

0개의 댓글