https://www.acmicpc.net/problem/2018
2018번: 수들의 합 5
어떠한 자연수 N은, 몇 개의 연속된 자연수의 합으로 나타낼 수 있다. 당신은 어떤 자연수 N(1 ≤ N ≤ 10,000,000)에 대해서, 이 N을 몇 개의 연속된 자연수의 합으로 나타내는 가지수를 알고 싶어한
www.acmicpc.net
저는 해당 문제를 투포인트 개념을 이용하여 문제를 해결하였습니다.
저는 시작 인덱스와 끝 인덱스를 가리키는 포인터 두개를 가지고 시작하였습니다.
처음에는 둘 다 0으로 시작합니다.
sum을 이용해 시작점과 끝점사이의 합을 구하였습니다.
sum이 입력값보다 작다면 끝점을 늘리고 이 값을 sum에 더해주고 같거나 크다면 시작점을 늘리고 이 값을 sum에 빼줌으로써 sum으로 시작점과 끝점사이의 합을 구하였고 sum가 입력값이 같다면 result를 늘려 결과값을 도출하였습니다.
시간복잡도 : O(n)
package BOJ.TwoPoint;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.function.Function;
public class BOJ_2018 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Function<String,Integer> stoi = Integer::parseInt;
int n = stoi.apply(br.readLine());
int result = cal(n);
System.out.println(result);
}
private static int cal(int number) {
int result = 0;
int startIndex = 0;
int endIndex = 0;
int sum = 0;
while(endIndex <= number){
if(sum < number){
sum += ++endIndex;
continue;
}else if(sum == number){
result++;
sum -= ++startIndex;
}else if(sum > number){
sum -= ++startIndex;
}
}
return result;
}
}
'알고리즘' 카테고리의 다른 글
백준 23289번 온풍기 안녕! (JAVA) (0) | 2022.04.18 |
---|---|
백준 14003번 가장 긴 증가하는 부분 수열 5 (JAVA) (0) | 2022.04.17 |
백준 1918번 후위 표기식 (JAVA) (0) | 2022.04.15 |
백준 2696번 중앙값 구하기 (JAVA) (0) | 2022.04.14 |
백준 2211번 네트워크 복구 (JAVA) (0) | 2022.04.13 |