Notice
														
												
											
												
												
													Recent Posts
													
											
												
												
													Recent Comments
													
											
												
												
													Link
													
											
									| 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 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 | 
													Tags
													
											
												
												- array
 - 알고리즘
 - 큰 수 출력하기
 - 임시반장 정하기
 - Pointer
 - 투 포인터
 - 점수계산
 - 백준
 - 뒤집은 소수
 - Two Pointer
 - 가장 짧은 문자거리
 - 등수구하기
 - 최대 길이
 - 코테준비
 - 아스키코드
 - GitHub #Commit #BaekJoon
 - ArrayList
 - 모든행과열대각선의합
 - 인프런
 - 공통원소 구하기
 - 배열
 - 10992
 - 두 배열 합치기
 - 격자판
 - java
 - 누적 계산
 - 10991
 - 연속부분수열
 - 자바
 - 보이는 학생
 
													Archives
													
											
												
												- Today
 
- Total
 
ezhoon
[인프런] 03_04 연속 부분 수열 (Two pointers) 본문
			[Java] 인프런 문제풀이/Two pointers, Sliding window
			
		[인프런] 03_04 연속 부분 수열 (Two pointers)
ezhoon 2022. 1. 21. 22:54📖 문제
- 첫째 줄 N, 특정 숫자 M이 주어진다.
 - 둘째 줄에는 N개의 수로 이루어진 수열이 주어진다.
- 수열의 합이 특정숫자 M이 되는 경우가 몇 번 있는지 구하시오
 
 - N = 8, M = 6인 경우 아래와 같은 배열을 가지면 3가지 입니다.
- {2, 1, 3}, {1, 3, 1, 1}, {3, 1, 1, 1}
 
 

⚠️ 주의사항
- Two pointers 알고리즘 풀 때 한 개의 배열일 때는 어떻게 해야 할지
 - 수열의 마지막을 벗어나지 않게 조심하기
 
2022.01.21 - [인프런_자바_알고리즘_기초/Two pointers, Sliding window] - 투 포인터란?
✍️ 이해
* 1. N개의 배열 M이 되는 경우
* 2. 투 포인터 방식으로 left, right 변수 선언
*  2-1. sum = left ~ right 사이 배열 합
*  2-2. M > sum -> sum += N[++right]
*  2-3. M < sum -> sum -= N[left++]
*  2-4. M == sum -> answer ++,  sum -= N[left++]
* 3. N == sum -> answer++ 마지막 값까지 확인해주기.
* 4. retrun answer;
✏️ 풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Java03_04 {
    public int solution(int N, int M, int[] arr) {
        int answer = 0, sum = 0;
        int left = 0, right = 0;
        sum = arr[left];
        while (right < N - 1) {
            if (M > sum) sum += arr[++right]; // right를 오른쪽으로 한 칸 옮기고 그 값을 sum에 누적
            else if (M < sum) sum -= arr[left++]; // 왼쪽 한 칸을 sum 값에서 빼고 left를 오른쪽으로 한 칸 이동
            else { // M = sum
                sum -= arr[left++]; // 같은 값의 경우에도 왼쪽 한 칸을 sum 값에서 빼고 left를 이동
                answer++; // answer 값 누적
            }
        }
        if (M == sum) answer ++; // 마지막 값 확인
        return answer;
    }
    public static void main(String[] args) throws IOException {
        Java03_04 T = new Java03_04();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        int[] arr = new int[N];
        st = new StringTokenizer(br.readLine(), " ");
        for (int i = 0; i < N; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        System.out.println(T.solution(N, M, arr));
    }
}

'[Java] 인프런 문제풀이 > Two pointers, Sliding window' 카테고리의 다른 글
| [인프런] 03_06 최대 길이 연속부분수열 (0) | 2022.01.22 | 
|---|---|
| [인프런] 03_05 연속된 자연수의 합 (Two pointer) (0) | 2022.01.21 | 
| 투 포인터, 슬라이딩 윈도우 (0) | 2022.01.21 | 
| [인프런] 03_03 최대 매출 (0) | 2022.01.21 | 
| [인프런] 03_02 공통원소 구하기 (0) | 2022.01.21 | 
			  Comments