반응형

투 포인터라는 알고리즘을 배웠음!

핵심 원리는 다음과 같음

1. start pointer / end pointer

2. end pointer을 오른쪽으로 옮기면 합이 증가

3. start pointer을 오른쪽으로 옮기면 합이 감소

4. pointer 이동한 뒤 목표합보다 작으면 -> end pointer를 오른쪽으로 옮긴다.

5. pointer 이동한 뒤 목표합보다 크면 -> start pointer를 오른쪽으로 옮긴다.

이제 여기서 문제마다

목표합과 같을때 무슨 액션을 할지 달라지는가 보다.

두번째 문제풀이

import java.util.*;

public class Problem1806 {
    //부분합
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int numsCount = sc.nextInt();
        int targetSum = sc.nextInt();
        sc.nextLine();
        int[] nums = new int[numsCount];
        for(int i=0; i<numsCount; i++){
            nums[i] = sc.nextInt();
        }

        int end = 0;
        int start = 0;
        int sum = 0;
        int minLen = numsCount+1;
        //end 포인터를 오른쪽으로 옮기면 합이 증가
        //start 포인터를 오른쪽으로 옮기면 합이 감소
    
        while(end < numsCount){ //end 포인터가 배열 마지막부분까지 가도록
            if(sum < targetSum){ //합이 목표합보다 작은 경우 : end 포인터를 오른쪽으로 옮긴다.
                sum += nums[end++];
            }
            while(sum >= targetSum){//합이 목표합보다 크거나 같은 경우 : start 포인터를 오른쪽으로 옮긴다.
                sum -= nums[start++];
                minLen = Math.min(minLen, end-start+1);
            }
        }
        
        if(minLen == numsCount + 1){
            System.out.println(0);
        }else{
            System.out.println(minLen);
        }
    }
    
}

 

첫번째 문제풀이

import java.util.*;

public class Problem1806 {
    //부분합
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int numsCount = sc.nextInt();
        int targetSum = sc.nextInt();
        sc.nextLine();
        int[] nums = new int[numsCount];
        for(int i=0; i<numsCount; i++){
            nums[i] = sc.nextInt();
        }

        int start = 0;
        int sum = 0;
        int minLen = numsCount+1;
        for(int end=0; end<numsCount; end++){
            sum += nums[end]; //end에 있는 수 더하기

            while(sum >= targetSum){//목표합보다 같거나 큰 경우 길이를 기록, start을 오른쪽으로 땡김
                minLen = Math.min(end-start+1,minLen);
                sum -= nums[start++];      
            } 

        }
        minLen = minLen == numsCount+1 ? 0 : minLen;
        System.out.println(minLen);
    }
    
}

 

아래코드는 다음과 같이 바꿀 수 있음

start += 1; 
sum -= nums[start-1];

=> sum -= nums[start++];

 

반응형

'코딩 관련 > 코딩문제풀기' 카테고리의 다른 글

[프로그래머스] Lv1. 소수 찾기  (0) 2024.11.16
[프로그래머스] Lv1. 덧칠하기  (0) 2024.11.15
[백준] 세 수 java  (0) 2024.11.14
[백준] 단지번호붙이기 java  (0) 2024.11.14
[백준] 바이러스 java  (0) 2024.11.12

+ Recent posts