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

ghsmsl님의 프로필 이미지
ghsmsl

작성한 질문수

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

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

어느 부분에서 오답인지 잘 모르겠어요

작성

·

252

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

 

영상보기 전 혼자 풀었었던 답인데 어떤 부분에서 오답인지 모르겠습니다. 도와주세요 ㅜ

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int N = scan.nextInt();
        int M = scan.nextInt();
        int[] nums = new int[N];

        int index1 = 0;
        int index2 = 1;
        int answer = 0;

        for (int i = 0; i < N; i++){
            nums[i] = scan.nextInt();
        }

        int sum = nums[index1] + nums[index2];
        while(index2<N-1){ // index2가 2일 때
            if(sum==M){ //
                answer++; // anser은 +1이 됨. 이 때 index2는 2
                sum -= nums[index1++];
                sum += nums[++index2]; // 인덱스 위치 옮겨줌. index2는 3이 됨.
                if(sum == M && index2 == N-1){
                    answer++;
                }
                continue;
            }
            if(sum<M){
                sum += nums[++index2];
                continue;
            }
            if(sum>M){
                sum -= nums[index1++];
                continue;
            }
        }
        System.out.println(answer);
    }
}

 

답변 2

1

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

안녕하세요^^

5 3

1 1 1 1 3

위 입력이 답이 3인데 2가 출력됩니다. 디버그해보세요. 그리고 저는 요즘에 이 문제를 영상의 방법보다 좀더 간결하게 아래와 같이 하고 있습니다. 참고하세요.

import java.util.*;
class Main {	
	public int solution(int n, int m, int[] arr){
		int answer=0, sum=0, lt=0;
		for(int rt=0; rt<n; rt++){
			sum+=arr[rt];
			while(sum>m){
				sum-=arr[lt++];
			}
			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 m=kb.nextInt();
		int[] arr=new int[n];
		for(int i=0; i<n; i++){
			arr[i]=kb.nextInt();
		}
		System.out.print(T.solution(n, m, arr));
	}
} 

1

안녕하세요, 인프런 AI 인턴입니다.

ghsmsl님, 코드를 보고 오답 부분을 찾으려면 문제의 정확한 요구사항과 여러 가지 테스트 케이스를 고려해야 해요. 제출하신 코드를 보면, index2

또한 sum == M 일 때 index1과 index2를 옮기는 로직에서 index2가 배열의 끝에 도달했을 때를 충분히 고려하지 않은 것 같아요. 이 부분도 확인이 필요합니다. 특히 배열의 마지막 요소를 처리할 때 off-by-one 오류가 발생하지 않도록 주의해야 합니다.

마지막으로, while문 내에서 sum이 M보다 클 경우 sum에서 nums[index1]을 빼고 index1을 증가 시키는데, 이 로직이 정확하게 동작하는지 다시 한 번 검증해볼 필요가 있습니다.

아래와 같은 테스트 케이스를 만들어서 코드가 정상적으로 동작하는지 확인해 보세요.
- N과 M이 같고 모든 숫자가 동일할 때 (예: N=5, M=15, nums=[3, 3, 3, 3, 3])
- N과 M이 같고 하나의 숫자만 M과 같을 때 (예: N=5, M=3, nums=[1, 2, 3, 4, 5])
- N과 M이 다르고 연속된 수들의 합이 M이 되는 경우가 여러개 있는 경우 (예: N=8, M=6, nums=[1, 2, 1, 3, 1, 1, 1, 2])

이후에도 오류가 발견되면 질문이나 코드와 함께 추가로 질문해주세요.

ghsmsl님의 프로필 이미지
ghsmsl

작성한 질문수

질문하기