• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

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

21.07.17 22:56 작성 조회수 158

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

질문자

2021.07.18

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

0

안녕하세요^^

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

0

beSlow님의 프로필

beSlow

질문자

2021.07.17

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

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

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

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

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

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