https://www.acmicpc.net/problem/2003
알고리즘 분류 : 브루트포스 알고리즘, 누적합, 투포인터
❓문제
🔅해석
두 수의 합이 특정 값이 되는 경우를 찾는 문제로 투포인터를 이용한다.
입력받은 숫자를 배열에 넣고 low pointer와 high pointer로 합을 구한다.
//입력
10 5
1 2 3 4 2 5 3 1 1 2
1) 초기화 및 sum < M
두개의 포인터 모두 0번째 인덱스부터 출발하고 sum은 0번째 인덱스 값으로 초기화해준다.
sum이 특정 값(M) 5보다 작으므로 high pointer를 +1 해준다. 그리고 sum에 증가된 high 번째의 값을 더한다.
2) sum == M
sum == M 이 될 때, cnt++ 해주고 low 또는 high을 +1 해준다. 그리고 sum에 증가된 high 번째의 값을 더한다.
3) sum > M
sum이 M 보다 커졌을 때는 sum에서 현재 low번째 값을 빼주고 low pointer를 +1 해준다.
⭕정답 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N, M;
static int[] numbers;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
numbers = new int[N + 1];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
numbers[i] = Integer.parseInt(st.nextToken());
}
int cnt = 0;
int low = 0, high = 0;
int sum = numbers[low];
while (true) {
if (high >= N)
break;
if (sum > M) {
sum -= numbers[low++];
} else if (sum == M) {
cnt++;
sum += numbers[++high];
} else {
sum += numbers[++high];
}
}
System.out.println(cnt);
br.close();
}
}
❗결과
'코딩테스트 > 백준' 카테고리의 다른 글
[코테] 백준 1927번 : 최소 힙 (java) (0) | 2024.08.04 |
---|---|
[코테] 백준 2805번 : 나무 자르기 (java) (0) | 2024.08.03 |
[코테] 백준 1713번 : 후보 추천하기 (java) (0) | 2024.08.03 |
[코테] 백준 1256번 : 사전 (java) (0) | 2024.08.03 |
[코테] 백준 1837번 : 암호제작 (java) (0) | 2024.08.03 |