1. 문제 설명
[문제 링크](https://www.acmicpc.net/problem/2018)
2. 접근 방식
투포인터 문제
- 투 포인터 구간 안에 합을 변수 acc에 저장한다.
- acc <= N이 안되면 오른쪽 포인터를 한 칸 움직여서 그 값을 acc에 더한다.
- acc > N 이면 왼쪽 포인터를 한 칸 움직여서 그 값을 acc에 더한다.
- 이렇게 오른쪽 포인터가 구간의 맨 끝에 도달할 때까지 반복하며 acc == N 인 경우를 센다.
3. 코드 분석
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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 cnt = 0, start = 0, end = 0, acc = 0;
while (end <= N){
if(acc < N){
end++;
acc += end;
}else {
if (acc == N){
cnt++;
end++;
acc += end;
}else {
start++;
acc -= start;
}
}
}
System.out.println(cnt);
}
}
4. 성장하기
투포인터 문제에서 내 취약점은 범위 산정이다.
- 포인터를 한 칸 앞으로 진행 시킨다.
- 포인터 사이의 합이 N이 되는지 확인한다.
이 두 가지 계산의 순서에 따라서 while문의 범위가 달라진다. (① -> ②) 로 할 경우, 위와 같이 while문의 범위를 <=N 까지만 하면 된다. 반면 (② -> ①) N이 더해지는 시점은 end = N+1인 시점이다. 따라서 마지막 N까지 더하려면 while문의 범위가 N+1까지여야 한다.
// 예시 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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 cnt = 0;
int start = 0;
int end = 0;
int acc = 0;
while (end <= N+1){
if(acc < N){
acc += end;
end++;
}else {
if (acc == N){
cnt++;
acc += end;
end++;
}else {
acc -= start;
start++;
}
}
}
System.out.println(cnt);
}
}
'알고리즘 > 문제 풀이' 카테고리의 다른 글
[백준] 11399 ATM (0) | 2024.07.02 |
---|---|
[백준] 1253 좋다 (0) | 2024.06.28 |
[백준] 11659 구간 합 구하기 4 쉬운 풀이 여러가지 풀이 java (0) | 2024.06.22 |
[백준] 구간 합 구하기 5 쉬운 풀이, 여러가지 풀이 java (0) | 2024.06.22 |
백준 11720_숫자의합 Java 여러가지 풀이! (0) | 2024.06.22 |