https://www.acmicpc.net/problem/2018
정답률 49.017%
어떠한 자연수 N은, 몇 개의 연속된 자연수의 합으로 나타낼 수 있다. 당신은 어떤 자연수 N(1 ≤ N ≤ 10,000,000)에 대해서, 이 N을 몇 개의 연속된 자연수의 합으로 나타내는 가지수를 알고 싶어한다. 이때, 사용하는 자연수는 N이하여야 한다.
예를 들어, 15를 나타내는 방법은 15, 7+8, 4+5+6, 1+2+3+4+5의 4가지가 있다. 반면에 10을 나타내는 방법은 10, 1+2+3+4의 2가지가 있다.
N을 입력받아 가지수를 출력하는 프로그램을 작성하시오.
15
4
N의 최대값은 으로 엄청 크다. 일일이 시작 인덱스만을 갱신시켜 나가서 경우의 수를 따지면 시간 초과가 날 것이다. 그래서 두 개의 인덱스를 이용하는 투 포인터를 이용한다.
시작 인덱스와 끝 인덱스를 1로 잡아 끝 인덱스가 N이 될 때까지 반복한다.
인덱스를 갱신시킬 때는 다음과 같이 구분한다.
처음에는 합이 N보다 작으니 end를 한칸 씩 증가시키며 sum에 더해간다.
if (sum < N) {
end++;
sum += end;
}
그러다가 sum이 N이 되는 순간이 오면 정답으로 카운트한다. 그리고 end를 다시 증가시킨다. 당연히 sum도 end만큼 더한다.
else if (sum == N) {
count++;
end++;
sum += end;
}
그럼 sum은 N보다 커질텐데 이때 start를 갱신시키기 위해 sum에서 현재 start를 빼주고 새로 갱신시킨다.
else if (sum > N) {
sum -= start;
start++;
}
//백준
public class Main {
public static void main(String[] args) throws IOException {
System.setIn(new FileInputStream("src/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int count = 1;
int start = 1;
int end = 1;
int sum = 1;
while (end < N) {
if (sum < N) {
end++;
sum += end;
} else if (sum == N) {
count++;
end++;
sum += end;
} else if (sum > N) {
sum -= start;
start++;
}
}
System.out.println(count);
}
}