알고리즘/백준
[백준] 2018 -자바
삼록이
2025. 7. 17. 13:24
https://www.acmicpc.net/problem/2018
투포인터를 사용해야하는 문제다.
public class Main {
public static void main(String[] args) throws IOException {
/*
1.자연수 n을 받는다.
2.1부터 n까지 늘어놓는다 생각하고 포인터 2개를 1에 세팅한다
3.두 포인터가 가르키는 수들의 합을 담는 변수 x를 둔다. 이 변수는 포인터 2개가 가르치는 범위의 합을 담으면 된다. 초기값으로는 1로 둔다.(포인터 2개가 1을 가르키고 있으니까)
4.합을 담는 변수가 n과 같으면 가지수 +1 이되고. 엔트포인터를 +1이동. 엔드포인트를 +1이동했다는 것은 새로운 엔드포인트갑을 더해줘야한다.
합을 담는 변수가 n보다 크면 시작포인트를 +1이동. 시작포인트 +1이동했다는 것은 기존에 시작포인트가 가르키는 값이 빠졌다는 것 그 값을 sum에서 먼저 빼줘야한다.
합을 담는 변수가 n보다 작으면 엔드포인터+1이동. 엔드포인트를 +1이동했다는 것은 새로운 엔드포인트갑을 더해줘야한다.
*/
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int startPointer = 1;
int endPointer = 1;
int sum =1;
int answer =0;
while(endPointer<=n){
if(sum == n){
answer++;
endPointer++;
sum+=endPointer;
} else if(sum>n){
sum -=startPointer;
startPointer++;
} else{ //sum<n일 경우
endPointer++;
sum+=endPointer;
}
}
System.out.println(answer);
}
}
예전에는 이렇게 푼 기록이 있다.
문제는 어차피 1부터 n까지의 자연수로 한정해 굳이 배열로 안받았었도 되는데 배열로 받아서 풀이했다.
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] arr = new int[n+1];
for(int i=1; i<n+1; i++){
arr[i] =i;
}
int start = 1;
int end = 1;
int total = arr[1];
int count =0;
while(start<=end && end<arr.length){
if(total == n ){
total-=arr[start];
start++;
count++;
} else if(total<n){
end++;
total+=arr[end];
} else{
total-=arr[start];
start++;
}
}
System.out.println(count);
}
}