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
- Pointer
- 등수구하기
- 가장 짧은 문자거리
- 10991
- 공통원소 구하기
- Two Pointer
- 코테준비
- 알고리즘
- ArrayList
- 격자판
- 임시반장 정하기
- 인프런
- 점수계산
- array
- 큰 수 출력하기
- 모든행과열대각선의합
- 두 배열 합치기
- 보이는 학생
- 연속부분수열
- 배열
- 투 포인터
- 아스키코드
- 백준
- 최대 길이
- GitHub #Commit #BaekJoon
- 자바
- 누적 계산
- 뒤집은 소수
- 10992
- java
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