강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

beSlow님의 프로필 이미지
beSlow

작성한 질문수

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

4. 연속부분수열(복합적 문제)

강의 듣기 전에 문제 풀어서 정답은 나왔는데....

작성

·

259

0

강의 듣기 전에 먼저 풀어서 정답은 나왔는데,

제 풀이가 이중for문과 뭐가 달라서 시간복잡도가 줄어든 건지 모르겠습니다(왜 정답이 나왔는지가 궁금합니다).

for 문 안에 while문을 넣으면서 반복문(반복문) 형태니까 n^2이어야 할 것 같은데 이중 for문 대비 시간이 줄어든 이유가 무엇일까요?

 

import java.util.*;

class Main{
	public int solution(int n, int m, int[] numArray) {
		int answer = 0;
		int sum = 0;
		int lt = 0;
		for(int i=0; i<n; i++) {
			sum = numArray[i];
			lt = i;
			if(sum > m)	{
				continue;
			} else {
				sum -= numArray[i];
				while(sum<=m && lt<n) {
					sum += numArray[lt++];
					if(sum==m) {
						answer++;
						break;
					}
				}
			}
		}
		
 		return answer;
	}

	public static void main(String[] args) {

		Main T = new Main();
		Scanner	in = new Scanner(System.in);
		int n = in.nextInt();
		int m = in.nextInt();
		int[] numArray = new int[n];
		for(int i=0; i<n; i++) {
			numArray[i] = in.nextInt();	
		}
		in.close();
		System.out.print(T.solution(n, m, numArray));
	}
}

 

답변 3

0

beSlow님의 프로필 이미지
beSlow
질문자

답변 감사합니다~ ^^!!

0

김태원님의 프로필 이미지
김태원
지식공유자

안녕하세요^^

프로그램 전체로 봐도 for문 안의 while문은 lt가 n까지 가면 멈추기 때문에 총 반복횟수는 n번밖에 반복하지 않습니다.

0

beSlow님의 프로필 이미지
beSlow
질문자

댓글로 질문드린 이후로 제가 생각한 답은 이렇습니다.
이렇게 이해해도 괜찮을까요?

--> for문의 경우 항상 n번을 돌아야 하지만,

while문의 경우 조건에 따라 n번 미만으로 돌 수 있고

결국 n * (n 미만의 어떤 수) 가 되므로 O(n^2)이 아니라 O(n)이 된다.

풀이에서 보면 while문을 썼을 때는 연속부분수열의 합이 M이 되는 순간 멈추기 때문에 n번을 다 돌지 않고 중간에 멈추게 되고, 그래서 이중 for문 대비 시간이 줄어든 것이다.

답변 부탁드립니다! 감사합니다.

beSlow님의 프로필 이미지
beSlow

작성한 질문수

질문하기