import java.util.*;
class Solution {
public int[] solution(int[] sequence, int k) {
int[] answer = new int[2];
int max_len = sequence.length;
for(int i=0; i<sequence.length; i++) {
int num = 0;
for(int j=i; j<sequence.length; j++) {
num += sequence[j];
if(num == k) {
//길이가 짧은 수열이 나와야 함 && 길이가 같다면 앞쪽 인덱스가 나와야 함
int len = j-i;
if(len < max_len) {
answer[0] = i;
answer[1] = j;
max_len = len;
break;
}
}
else if(num > k) {
break;
}
}
}
return answer;
}
}
사실 조건을 대충 봐서 sequence의 길이가 아닌 원소의 범위를 봤다. 1000까지 이길래 "오~ 이중 for문 가능가능ㅎㅎ" 하고 풀었음ㅜㅜㅜ
암튼 효율성 엉망으로 나와서 58점인가.... 암튼 실패 떼잉
비법은 투포인터~ (몰랐어)
//투포인터
import java.util.*;
class Solution {
public int[] solution(int[] sequence, int k) {
int[] answer = new int[2];
int left = 0;
int sum = 0;
int max_len = sequence.length;
int ans1 = 0;
int ans2 = 0;
for(int right = 0; right<sequence.length; right++) {
sum += sequence[right];
//합이 k를 넘어버리면 왼쪽(left)에서 하나씩 빼주기
if(sum > k) {
while(sum > k) {
sum -= sequence[left];
left++;
}
}
//k와 같다면
if(sum == k) {
//길이가 짧은 인덱스가 나와야 함
int len = right-left;
if(len < max_len) {
ans1 = left;
ans2 = right;
max_len = len;
}
//길이가 같다면 앞쪽의 인덱스가 나와야 함
else if(len == max_len) {
ans1 = Math.min(ans1, left);
ans2 = Math.min(ans2, right);
}
}
}
answer[0] = ans1;
answer[1] = ans2;
return answer;
}
}
정답!
투포인터 문제...!! 막상 풀면 쉬운데 투포인터를 떠올리기가 쉽지 않다. 많이 풀면 자연스럽게 생각나겠지 모~
왜 항상 예시코드는 돌아갈까? 희망고문이다. 시험칠 때는 정답 못돌려보잖아 그럼 나 맞췄다 생각하고 기분 좋게 넘어갈 거 아냐 하........