연속 부분수열

Seungmin Lim·2022년 2월 8일
0

코딩문제연습

목록 보기
30/63

문제

나의풀이

import java.util.*;

class Main {
	public int solution(int n,int m, int[] arr) {
			int answer = 0 ;
			int sum = 0;
			int start = 0;
			
			for(int end = 0; end<n; end++) {
				sum += arr[end];
				if(sum == m) {answer++;}
				while(sum >= m) {
					sum -= arr[start++];
					if(sum == m) answer++;
				}
			}
			return answer;
		}
		    
	public static void main(String[] args) {
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		int n = kb.nextInt(); 
		int[] arr = new int[n];
		int m = kb.nextInt();
		for (int i = 0; i < n; i++) {
			arr[i] = kb.nextInt();
		}
		System.out.pr**텍스트**intln(T.solution(n, m, arr));
	}
	
}

풀이방법

1 2 1 3 1 1 1 2 이 담긴 1차원 배열에서 m=6일때, 연속으로 더해 m값이 되면 카운팅을 한다.
처음엔 while문 안에 for문을 넣어서 풀어보려했지만 잘 되지 않았다.
풀이방법은 우선 start와 end를 정해줘서 start가 end를 쫓아가는 과정이다.

for문의 int 변수를 end로 하고 처음 sum값에
arr[end] = 즉, 첫번째 값을 넣었다.
첫번째 sum 값 또한, m 일수도 있으므로 체크를 해줘야 한다.
sum = m 이면 카운팅,
m보다 적다면 다음 for문,
m보다 크다면 while문을 거치게 된다.
while문은 sum이 m보다 크거나 같을때 거치게 되는데,
while문 안에서는 end값이 고정되고 sum값이 m보다 작아질때까지 arr[start]를 빼주면 start가 end를 쫓아간다.
이 과정에서 sum = m 이 발생한다면 카운팅을 해준다.

핵심키워드

for문 안에 while문을 적용시켜서 start값이 end값을 쫓아가게 만드는것이 핵심인것같다!

0개의 댓글