https://www.acmicpc.net/problem/1024
1024번: 수열의 합
첫째 줄에 N과 L이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이고, L은 2보다 크거나 같고, 100보다 작거나 같은 자연수이다.
www.acmicpc.net
저는 투포인트를 이용해 문제를 해결하였습니다.
투 포인트를 통해 두 숫자 사이의 합을 구하고 이 값이 n보다 작다면 뒤 포인트를 늘려 합을 늘리고, 크다면 앞 포인트를 늘려 합을 줄여 나가면서 n과 같아지는 순간을 찾고 그 중 제일 짧은 길이를 구하였습니다.
만약 95%에서 틀렸습니다가 나온다면
입력 1 2 -> 답 0 1 이 나오는지 확인해보시기 바랍니다.
package BOJ.twopoint;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.function.Function;
public class BOJ_1024 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Function<String,Integer> stoi = Integer::parseInt;
StringTokenizer st = new StringTokenizer(br.readLine());
int n = stoi.apply(st.nextToken());
int l = stoi.apply(st.nextToken());
int startNum = 0;
int endNum = 0;
int sum = 0;
int[] result = null;
while(endNum <= n + 1){
if(endNum - startNum > 100){
sum -= startNum;
startNum++;
continue;
}
if(sum < n){
sum += endNum;
endNum++;
}else if(sum == n){
if(endNum - startNum >= l && result == null){
result = new int[]{startNum, endNum};
}else if(endNum - startNum >= l && result[1] - result[0] > endNum - startNum){
result = new int[]{startNum,endNum};
}
sum -= startNum;
startNum++;
}else{
sum -= startNum;
startNum++;
}
}
if(result == null){
System.out.println(-1);
return ;
}
for(int i = result[0] ; i < result[1] ; i++){
System.out.print(i+" ");
}
}
}
'알고리즘' 카테고리의 다른 글
백준 1051번 숫자 정사각형 (JAVA) (0) | 2023.08.02 |
---|---|
백준 1049번 기타줄 (JAVA) (0) | 2023.08.01 |
백준 1010번 다리 놓기 (JAVA) (0) | 2023.07.30 |
프로그래머스 이진 변환 반복하기 (JAVA) (0) | 2023.07.29 |
백준 1005번 ACM Craft (JAVA) (0) | 2023.07.28 |