문제의 조건 중 눈여겨 봐야할 것은
"실제 정답과 출력값의 절대오차 또는 상대오차가 10-2 이하이면 정답이다." 는 것이다.
처음 제출했을때 틀린코드는 아래와 같다.
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.util.StringTokenizer;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for(int i = 0; i < N; i++){
arr[i] = Integer.parseInt(st.nextToken());
}
int max = arr[0];
int sum = 0;
for(int i = 0; i < N; i++){
if(max< arr[i]){
max = arr[i];
}
sum += arr[i];
}
double norm = (100 * sum) / (N * max);
System.out.print(norm);
}
}
이는 변수에 대한 이해가 부족해서 였다.
변수의 메모리 크기는 아래와 같은데,
byte < char, short < int < float < long < double
연산에서 상대적으로 메모리가 큰 데이터 타입으로 형변환 되어서 연산 된다.
즉, int + double 연산이라면 int가 double로 변환되고 결과값도 double이 된다.
에러가 발생한 부분은
double norm = (100 * sum) / (N * max);
바로 위의 부분이다.
norm을 double로 선언해도 (100 * sum) / (N * max)에서
sum, N, max모두 int -> 즉, 정수끼리의 연산이기에 "이미 오차를 발생 시킨 후에 double로 변환 시킨 것"이다.
그래서, sum, N, max중 아무것이나 하나 double로 선언해주면 (100 * sum) / (N * max) 안에 있는
변수 sum, N, max 이 모두 double로 바뀐 후에 연산되어 오차가 발생하지 않는다.
본인의 경우에는
int sum = 0; => double sum=0;으로 바꿔주었다.
완성된 코드
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.util.StringTokenizer;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for(int i = 0; i < N; i++){
arr[i] = Integer.parseInt(st.nextToken());
}
int max = arr[0];
double sum = 0;
for(int i = 0; i < N; i++){
if(max< arr[i]){
max = arr[i];
}
sum += arr[i];
}
double norm = (100 * sum) / (N * max);
System.out.print(norm);
}
}
'Programming > 알고리즘' 카테고리의 다른 글
[백준] 4344 - 평균은 넘겠지 - JAVA[자바] (0) | 2022.11.27 |
---|---|
[백준] 8958 - OX퀴즈 - JAVA[자바] (0) | 2022.11.27 |
[백준] 3052 - 나머지 - JAVA[자바] (0) | 2022.11.27 |
[백준] 5597 - 과제 안 내신 분..? - JAVA[자바] (0) | 2022.11.27 |
[백준] 10871 - X보다 작은 수 - JAVA[자바] (0) | 2022.11.27 |