본문 바로가기
Algorithm & SQL/BAEKJOON

백준 JAVA 2559 수열

by YoonJong 2022. 9. 1.
728x90

https://www.acmicpc.net/problem/2559

 

2559번: 수열

첫째 줄에는 두 개의 정수 N과 K가 한 개의 공백을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 온도를 측정한 전체 날짜의 수이다. N은 2 이상 100,000 이하이다. 두 번째 정수 K는 합을 구하기

www.acmicpc.net

조금만 고민하면 어렵지 않게 풀리는 문제였다.

제출하고 한번 틀렸는데 이유는 아래와 같다.

// 입력받은 값들이 전부 - 일때도 있기때문에 0으로 초기화하면 틀림
int answer = Integer.MIN_VALUE;

조건에서 -100 ~ 100 까지의 값이 들어올 수 있으므로, 전부다 음수만 들어올 수 있다.

수정 전에 0 으로 초기화를 했는데, 이러면 답이 0 으로 밖에 나올 수 없다.

따라서 최대 , 최소값을 구할때는 Integer.MIN 또는 MAX 를 사용해서 푸는 것이 바람직하다.

 

while (s + k <= n) {
    int max = 0;
    for (int i = s; i < s + k; i++) {
        max += arr[i];
    }
    answer = Math.max(answer, max);
    s++;
}

while문을 사용했다. 조건은 s+k 이며, s 는 스타트값 0 이고 k는 몇개세는지에 대한 값이다.

for문을 돌릴 때는, k 만큼의 수를 더해야 하므로, s ~ s+k 의 값을 구한다.

answer 에는 Math.max 를 이용해서 처음부터 끝까지 돌린 수 중 가장 큰값을 넣어준다.

 

package BAEKJOON.Silver.Ⅲ;
/**
 * 시간 제한   메모리 제한 제출 정답 맞힌 사람  정답 비율
 * 1 초 128 MB 22361  8203   6682   36.454%
 */

import java.util.Scanner;
public class NO2559 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt(); //정수의 개수
        int k = sc.nextInt(); //연속 몇개

        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }
        int s = 0;
        // 입력받은 값들이 전부 - 일때도 있기때문에 0으로 초기화하면 틀림
        int answer = Integer.MIN_VALUE;

        while (s + k <= n) {
            int max = 0;
            for (int i = s; i < s + k; i++) {
                max += arr[i];
            }
            answer = Math.max(answer, max);
            s++;
        }
        System.out.println(answer);
    }
}
728x90

댓글