문제 설명
정수 배열 arr가 주어집니다. 배열 안의 2가 모두 포함된 가장 작은 연속된 부분 배열을 return 하는 solution 함수를 완성해 주세요.
단, arr에 2가 없는 경우 [-1]을 return 합니다.
제한사항
- 1 ≤ arr의 길이 ≤ 100,000
입출력 예
arr | result |
[1, 2, 1, 4, 5, 2, 9] | [2, 1, 4, 5, 2] |
[1, 2, 1] | [2] |
[1, 1, 1] | [-1] |
[1, 2, 1, 2, 1, 10, 2, 1] | [2, 1, 2, 1, 10, 2] |
import java.util.*;
class Solution {
public int[] solution(int[] arr) {
int pointer1 = -1;
int pointer2 = -1;
// 2의 위치를 찾아 포인터를 설정
for (int i = 0; i < arr.length; i++) {
if (arr[i] == 2) {
if (pointer1 == -1) {
pointer1 = i; // 첫 번째 2의 위치
}
pointer2 = i; // 계속해서 마지막 2의 위치를 업데이트
}
}
// 2가 하나도 없는 경우 [-1] 반환
if (pointer1 == -1) {
return new int[] {-1};
}
// pointer1부터 pointer2까지의 배열 부분을 복사하여 반환
return Arrays.copyOfRange(arr, pointer1, pointer2 + 1);
}
}
큰 틀은 그대로 가져가는데 약간의 문법 오류나 코드상 개선 사항을 GPT를 통해 첨삭 받음.
첨삭 받을 일이 아예 없으면 좋겠지만... 뭘 이렇게 자꾸 온전하지 못 하게 쓰는지 모르겠음.
이 문제를 통해서는 '투 포인터', '슬라이딩 윈도우' 기법? 알고리즘?을 알게 되었다.
어제 코테 스터디에서 어떤 분이 pointer 변수 2개를 가지고 문제를 풀었던데 그게 투 포인터 기법이었구만.