2851 슈퍼 마리오 🟫

kkmdevel·2024년 9월 29일

코딩테스트

목록 보기
10/21

📋문제 정리

  • 버섯이 10개가 주어지고 차례로 먹을 수 있다.
  • 점수의 합이 100이랑 가장 가까울때 점수를 출력한다

🎯풀이

  • 연속되는 구간의 합을 이용하는 문제이다.
  • 차례대로 더한 누적 합 배열을 이용한다.
  • 누적 합 배열을 순회하면서 100을 뺀 값에 대해서 절대값이 가장 작은 값을 출력한다.

    절대값이 같으면 큰 수를 출력하기 때문에 별 다른 조치 없이 순회하면 된다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.*;

public class Main {

  static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  static StringTokenizer st;
  static StringBuilder sb =  new StringBuilder();

  public static void main(String[] args) throws IOException {
    int arr[] = new int[10];
    int ps[] = new int[10]; // 누적합 배열
    int sum = 0;
    int result = 0;

    for(int i=0;i<10;i++)
      arr[i] = Integer.parseInt(br.readLine());
    
    for(int i=0;i<10;i++){
      sum+=arr[i];
      ps[i] = sum; //누적 합 배열 초기화
    }

    for(int i=0;i<10;i++){ // 풀어쓴 과정 절대값 사용하지 않을 때
      if(ps[0] == 100 || ps[i] ==100){
        result = 100;
        break;
      }
      if(ps[i]>100){
        if(100-ps[i-1] == ps[i]-100 || 100-ps[i-1]>ps[i]-100)
          result = ps[i];
        
        else
          result =ps[i-1];
        break;
      }
      result = ps[i];
    }
    
    for(int i=0;i<10;i++){ // 절대값을 사용할 때
      if(Math.abs(100-ps[i])<=min){
        min = Math.abs(100-ps[i]);
        result = ps[i];
      }
    }
    
    sb.append(result);
    System.out.println(sb);
    br.close();
  }
}
profile
25/08/12

0개의 댓글