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

 

2851번: 슈퍼 마리오

첫째 줄에 마리오가 받는 점수를 출력한다. 만약 100에 가까운 수가 2개라면 (예: 98, 102) 마리오는 큰 값을 선택한다.

www.acmicpc.net

 

코드설명

누적합 문제입니다.

 

  1. 크기가 10인 배열 arr과 부분합을 저장할 배열 prefixSum을 초기화합니다.
  2. 10번 반복하면서 각 배열의 값을 입력받고 부분합을 계산하여 prefixSum에 저장합니다.
  3. 배열의 각 원소를 순회하면서 현재 위치까지의 부분합인 before와 다음 위치까지의 부분합인 after를 저장합니다.
  4. 만약 after가 100 이상이면, 100에 가장 가까운 값을 찾습니다.
    • before와 after와 100과의 차이를 계산하여 어떤 값이 더 가까운지 비교합니다.
    • 가까운 값으로 answer를 업데이트하고 출력한 뒤 프로그램을 종료합니다.
  5. 만약 모든 원소를 순회해도 100에 가까운 값이 나오지 않았다면, 마지막으로 계산된 answer를 출력합니다.

 

처음에 96프로에서 계속해서 통과를 못햇엇는데 이유는 answer의 갱신조건이 100보다 클 경우에만 작동했기때문입니다.

answer = after로 처리하여 무조건적으로 처리하도록 하여 100이 넘지않더라도 갱신되도록 했습니다.

출처 : https://www.acmicpc.net/board/view/100438
0
0
0
0
0
0
0
0
0
1
정답 : 1
내 오류 : 0
1
1
1
1
1
1
1
1
1
1
정답 : 10
내 오류 : 0

코드

위의 반례를 반영하여 마지막값까지 반영합니다. 처음부터 answer값에 after값을 삽입하여서 연산을 진행하고, 만약에 이후에 비교하여 before값이 after값보다 100보다 가까우면서 더 작은 조건을 만족한다면 변화시킵니다.

answer = after 연산을 통해 after는 항상 before보다 100에 가깝고, 만약 after >= 100 을 초과한다면 그때는 before와 비교연산하도록 처리합니다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
public static int N, M, K, T;
public static int answer = 0;
public static int[] arr;
public static int[][] map;
public static int[] prefixSum;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// StringTokenizer st = new StringTokenizer(br.readLine());
arr = new int[10];
prefixSum = new int[11];
for(int i=0;i<10;i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
arr[i] = Integer.parseInt(st.nextToken());
prefixSum[i+1] = prefixSum[i] + arr[i];
}
int before = 0;
int after = 0;
for(int i=0;i<10;i++) {
before = prefixSum[i];
after = prefixSum[i+1];
answer = after;
if(after >= 100) { //만약 after가 100을 넘었다면 before값도 100과 가장 가까운값입니다.
int diffBetweenBefore = Math.abs(100 - before);
int diffBetweenAfter = Math.abs(100 - after);
if(diffBetweenBefore < diffBetweenAfter) {
answer = before;
}else if(diffBetweenBefore >= diffBetweenAfter){
answer = after;
}
System.out.println(answer);
return ;
}
}
System.out.println(answer);
}
}

 

 

처음에 마지막 값을 올바르게 갱신안한 코드입니다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
public static int N, M, K, T;
public static int answer = 0;
public static int[] arr;
public static int[][] map;
public static int[] prefixSum;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// StringTokenizer st = new StringTokenizer(br.readLine());
arr = new int[10];
prefixSum = new int[11];
for(int i=0;i<10;i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
arr[i] = Integer.parseInt(st.nextToken());
prefixSum[i+1] = prefixSum[i] + arr[i];
}
int before = 0;
int after = 0;
for(int i=0;i<10;i++) {
before = prefixSum[i];
after = prefixSum[i+1];
if(after >= 100) { //만약 after가 100을 넘었다면 before값도 100과 가장 가까운값입니다.
int diffBetweenBefore = Math.abs(100 - before);
int diffBetweenAfter = Math.abs(100 - after);
if(diffBetweenBefore < diffBetweenAfter) {
answer = before;
}else if(diffBetweenBefore >= diffBetweenAfter){
answer = after;
}
System.out.println(answer);
return ;
}
}
System.out.println(answer);
}
}

+ Recent posts