백준 2018
백준 2018 문제
import java.util.Scanner;
public class Boj2018 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int count = 1;
int sum = 1;
int startIndex = 1;
int endIndex = 1;
while (endIndex != n) {
if (sum == n) {
count++;
endIndex++;
sum += endIndex;
} else if (sum > n) {
sum -= startIndex;
startIndex++;
} else {
endIndex++;
sum += endIndex;
}
}
System.out.println(count);
}
}
풀이
- 최대 n의 수 10,000,000 제한 시간은 2초로 O(n log n)은 시간 초과가 나기 떄문에 O(log n) 혹은 O(n)을 사용해야 한다.
- 연속된 값의 합이기에 O(n)의 시간 복잡도를 가진 투 포인터 알고리즘을 사용한다.
- n도 연속된 값의 합이기에 미리
count를 1로 초기화한다.
startIndex와 endIndex가 1부터 시작하기에 두 인덱스의 값의 합인 1로 sum을 초기화한다.
endIndex가 n이 아니면 whlie문을 통해 반복하도록 한다.
n과 startIndex부터 endIndex까지의 값의 합인 sum이 같은 경우에는 count와 endIndex의 값을 1씩 더하고, sum에 1을 더한 endIndex의 값을 더한다.
sum이 n보다 큰 경우 sum에 startIndex의 값을 빼고, startIndex의 값에 1을 더한다.
sum이 n보다 작은 경우 endIndex에 1을 더하고, sum에 1을 더한 endIndex의 값을 더한다.
endIndex가 n과 같아지면, 1부터 n까지 한바퀴 반복했기에 최종적으로 count값을 출력한다.