<Algorithm> 21. 1806번 부분합
by BFine반응형
1. 1806번 부분합
주어진 배열을 순서대로 기준점을 두어 더했을때 기준 결과값 이상일 경우 그 기준점의 차이값의 최소값을 구하는 문제
주의할점은 2와 3일경우 길이는 2가 된다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { static int min = Integer.MAX_VALUE; static boolean confirm = false; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int N = Integer.parseInt(st.nextToken()); int S = Integer.parseInt(st.nextToken()); int[] input = new int[N]; st = new StringTokenizer(br.readLine()); for(int i = 0; i < N; i++) { input[i] = Integer.parseInt(st.nextToken()); } partSum(input, S, 0, 0); if(confirm) { System.out.println(min); }else { System.out.println(0); } } private static void partSum(int[] input, int S, int left, int right) { int res = 0; if(right == input.length) return; for(int i = left; i <= right; i++) { res += input[i]; } if(res <= S || ((left == right)&& res >= S) ) { if(res == S) { int len = right - left + 1; if(min > len) min = len; // 최소값 변경 confirm = true; } partSum(input, S, left, right + 1); }else if(res > S) { if(res >= S) { int len = right - left + 1; if(min > len) min = len; // 최소값 변경 confirm = true; } partSum(input, S, left + 1, right); } } } | cs |
반응형
'공부(2018~2019) - 스킨변경전 > Algorithm' 카테고리의 다른 글
<Algorithm> 23. 1085번 직사각형에서 탈출하기 (0) | 2018.08.02 |
---|---|
<Algorithm> 22. 1261번 알고스팟(벽1 부수기) (0) | 2018.08.01 |
<Algorithm> 21. 2003번 수들의 합2 (0) | 2018.08.01 |
<Algorithm> 20. 9095번 1,2,3 더하기 (0) | 2018.07.31 |
<Algorithm> 19. 1963번 소수경로 (0) | 2018.07.31 |
블로그의 정보
57개월 BackEnd
BFine