🔺 문제
1806번: 부분합
첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.
www.acmicpc.net
🔺 코드
- 틀림
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
import java.util.*;
import java.io.*;
public class Main {
public static int N, S;
public static int[] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
N = Integer.parseInt(st.nextToken());
S = Integer.parseInt(st.nextToken());
arr = new int[N];
st = new StringTokenizer(br.readLine()," ");
for(int i = 0 ; i < N ; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
// 투 포인터
int left = 0;
int right = 1;
int answer = 0;
int min = Integer.MAX_VALUE;
while(left < right) {
if(sum(left, right) >= S) {
min = Math.min(min, right - left + 1);
left++;
} else {
right++;
}
}
System.out.println(min);
}
public static int sum(int l, int r) {
int total = 0;
for(int i = l ; i <= r ; i++) {
total += arr[i];
}
return total;
}
}
|
cs |
sum() 메소드가 배열 인덱스를 벗어나는 상황에서 호출된다며
런타임 에러가 떴당... (right 때문인듯)

- 정답
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
import java.util.*;
import java.io.*;
public class Main {
public static int N, S;
public static int[] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
N = Integer.parseInt(st.nextToken());
S = Integer.parseInt(st.nextToken());
arr = new int[N];
st = new StringTokenizer(br.readLine()," ");
for(int i = 0 ; i < N ; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
int left = 0;
int right = 0;
int sum = 0;
int answer = Integer.MAX_VALUE;
while(left <= right) {
if(sum >= S) {
answer = Math.min(answer, right - left);
sum -= arr[left++];
}
else if(right == N) {
break;
}
else {
sum += arr[right++];
}
}
System.out.println(answer == Integer.MAX_VALUE ? 0 : answer);
}
}
|
cs |
✅ 해결 아이디어
✔ 투 포인터
- 시작과 종료 포인터를 모두 0에서부터 시작.
- 시작 위치부터 종료 위치까지의 합이 S보다 크거나 같다면, 현재 칸 값 뺌 & 시작 포인터 위치를 오른쪽으로 한 칸 이동
- 시작 위치부터 종료 위치까지의 합이 S보다 작다면, 현재 칸 값 더함 & 종료 포인터 위치를 오른쪽으로 한 칸 이동
💥 유의사항
• right 포인터는 항상 N보다 작거나 같아야 함.
🔺 다른 풀이들
- 과정 설명 굿..
[백준]1806: 부분합 - JAVA
[백준]1806: 부분합 www.acmicpc.net/problem/1806 1806번: 부분합 첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으
moonsbeen.tistory.com
- while문 안의 조건식을 아예 right <= N
으로 잡으셨다. 나도 이렇게 했어야 더 좋았을 것 같다.
[백준 1806] - 부분합(JAVA)
[문제] -출처 https://www.acmicpc.net/problem/1806 1806번: 부분합 첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으
dding9code.tistory.com
- 왜 right - left + 1
이 아니라 right- left
하는거지? 했는데 여기에 대한 해답을 얻을 수 있었다!!!
[알고리즘] 백준 1806 부분합 -투포인터- 자바 코틀린
www.acmicpc.net/problem/1806 1806번: 부분합 첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자
youngest-programming.tistory.com
- right - left + 1
하고 싶으면 이렇게.. (위 아래 순서만 바꾸면 된다.)
[백준/자바] 1806 부분합
문제 10,000 이하의 자연수로 이루어진 길이 N짜리 수열이 주어진다. 이 수열에서 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이를 구하는 프로그램을 작성하시오.
settembre.tistory.com
💬 느낀 점
조건을 놓치지 말고 잘 풀자!
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
'코테 > 백준' 카테고리의 다른 글
[백준/JAVA] 3085번: 사탕 게임 (0) | 2023.05.23 |
---|---|
[백준/JAVA] 16916번: 부분 문자열 (0) | 2023.05.22 |
[백준/JAVA] 1062번: 가르침 (0) | 2023.05.21 |
[백준/JAVA] 14719번: 빗물 (0) | 2023.05.20 |
[백준/JAVA] 2504번: 괄호의 값 (0) | 2023.05.20 |