Completion over Perfection

백준 2003 - 수들의 합2 (JAVA 자바) 본문

자바 (Java)

백준 2003 - 수들의 합2 (JAVA 자바)

난차차 2023. 1. 5. 20:42
반응형

백준 2003 - 수들의 합2 (JAVA 자바)

 

https://www.acmicpc.net/problem/2003

 

2003번: 수들의 합 2

첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.

www.acmicpc.net

 

 

 

투포인터의 개념만 공부하고 스스로 풀어보려고 노력을 했습니다. 

(왼쪽/오른쪽을 이동시켜가면서 구간합을 그때그때 구하는 개념)

 

코드짜면서 미쳐 생각하지 못했던 포인트들과 주의해야할 점은 아래 정리해 두었습니다. 

 

 

<중요포인트>

 

1. 예를들어 첫번째부터 세번째 숫자까지의 합을 구해야 될 경우, for문을 써서 합을 다 더해줘야 합니다. 

    저는 바보같이 수치가 저장된 배열에서 첫번째부터 세번째까지의 합을 구해야할 경우,
    map[1] + map[3] 이런식으로 짰던 적이 있어서 틀렸었습니다.

 

2. left와 right가 모두 N에 다다를때까지 while 문을 돌려줘야 합니다. (부등호 "<=" 을 사용해서 while문을 돌립시다)

 

3. 숫자하나만으로도 M값이 충족되는 경우가 있으므로 이 부분도 처리해줘야 합니다.
    (left와 right가 일치하는 경우의 로직을 짜주면 되겠죠?)

 

4. 일반적으로는 left값이 right값을 초과하지 않지만, left값이 right값을 초과하는 케이스가 있습니다.
    이럴경우 어떻게 처리할지를 생각해봐야 합니다.

 

5. sum 값이 int의 범위를 넘어설 수도 있습니다. long으로 선언하는게 좋습니다. 

 

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import java.io.*;
import java.util.*;
 
class upgrade{
    static int N;
    static long M;
 
    public static void main(String args[]) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;
 
        st = new StringTokenizer(br.readLine());
 
        N = Integer.parseInt(st.nextToken()); // 4
        M = Long.parseLong(st.nextToken());  // 2
 
        int map[] = new int[N+1];
 
        st = new StringTokenizer(br.readLine());
 
        for(int i=1; i<=N; i++){
            map[i] = Integer.parseInt(st.nextToken());
        }
 
        int left = 1;
        int right = 1;
        int ans = 0;
 
        while(left<=&& right<=N){
            long sum = 0;
            if (left == right && left <=&& right <=N) sum += map[left];
            else if (left != right && left <=&& right <=N){
                for(int i=0; i<=right-left; i++){
                    sum += map[left+i];
                }
            }
 
            if (sum < M && right <= N) {
                if (right == N) left += 1;
                else{
                    right += 1;
                }
            }else if (sum > M && left <= N) {
                if (left == N) right += 1;
                else{
                    left += 1;
                }
            } else if (sum == M){
                ans ++;
                left += 1;
            }
        }
 
        bw.write(ans + "\n");
        bw.flush();
        bw.close();
 
    }
 
 
 
 
}
cs
반응형
Comments