728x90
https://www.acmicpc.net/problem/2018
📝 유튜브 풀이
https://www.youtube.com/watch?v=ZovjkF2DzIs&list=PLFgS-xIWwNVU_qgeg7wz_aMCk22YppiC6&index=5
- N의 최댓값이 크기 때문에 O(nlogn)의 시간 복잡도 알고리즘을 사용하면 시간 제한을 초과하므로 O(n)의 시간복잡도 알고리즘을 사용해야함.
→ 이 때 투포인터 사용 - 시작인덱스와 종료 인덱스를 지정하여 연속된 수를 표현
- 시작과 종료 인덱스를 맨 앞자리에 둔다.
초기화 sum =1 count =1
sum : 시작 인덱스와 종료 인덱스가 갖는 연속된 합의 크기
count : 연속된 수의 케이스 ( 숫자 그 자체 (N 그자체) 가 될 수 있기 때문에 미리 저장하여 1로 초기화)
- 포인터 이동 원칙을 활용해 배열의 끝까지 탐색하면서 합이 N이 될 경우의 수를 구한다.
시작 인덱스가 오른쪽으로 한 칸 이동 하는 것은 연속된 자연수에서 왼쪽 값을 삭제하는 것과 효과가 같으며,
종료 인덱스가 오른쪽으로 한 칸 이동 하는 것은 연속된 자연수의 범위를 한 칸 더 확장하는 의미
같을 때에는 경우의 수를 1 증가시키고 종료 인덱스를 오른쪽으로 이동
투 포인터 이동 원칙
- sum > N : sum = sum - 시작 인덱스 ; 시작인덱스 ++;
- sum < N : 종료 인덱스 ++; sum = sum + 종료 인덱스 ;
- sum == N : 종료 인덱스 ++; sum = sum + 종료인덱스 ; count ++;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int count =0;
int start_index = 1;
int end_index = 1;
int sum =1;
while(end_index != N) {
if(sum==N) {
count++;
end_index++;
sum += end_index;
} else if(N<sum) {
sum -= start_index;
start_index++;
} else if (sum<N) {
end_index++;
sum += end_index;
}
}
System.out.println(count);
}
}
📝 나의 풀이
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int answer = 0;
for(int i=1; i<=N; i++) {
int sum =0;
for(int j=i; j<=N; j++) {
sum+=j;
if(N<sum) {
break;
} else if (sum==N) {
answer++;
break;
}
}
}
System.out.println(answer);
}
}
728x90
'코딩테스트 > [JAVA] 백준' 카테고리의 다른 글
[백준 | JAVA | 4134번] 다음 소수 (0) | 2023.11.11 |
---|---|
[백준 | JAVA | 2485번] 가로수 (0) | 2023.11.10 |
[백준 | JAVA | 11659번] 구간합 구하기 (0) | 2023.11.05 |
[백준 | JAVA | 1546번] 평균 (0) | 2023.11.04 |
[백준 | JAVA | 1735번] 분수 합 (1) | 2023.11.03 |