https://www.acmicpc.net/problem/1546
설명 :
첫 줄에는 과목의 수 N를 입력받고, 두 번째줄에는 현재의 성적을 입력받는데, 입력된 성적은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다.
자신이 입력한 점수 중 최댓값을 M, 모든 점수를 점수/M*100으로 고쳐서 계산 후 평균을 구하는 문제
이 문제를 풀면서 형 변환에 대해 생각을 안 했었는데, 결과값이 내가 의도한 방법과 다르게 나오자 형변환을 떠올렸고, 그 결과 정답은 형변환에 있었다.
이 문제를 접근하기에 있어 형변환에 대해 알아야 한다. 내가 이 전에도 계속해서 형 변환 메소드를 사용하긴 했다...
형변환은 말 그대로 변수나 리터럴의 타입을 다른 타입으로 변환하는 것이다.
이 문제에서 핵심은 바로 이 형변환이라 생각한다.
예시 코드
double d = 3.14;
int score = (int)d;
System.out.println(d);
System.out.println(score);
예시 코드를 확인해보면 double형 d를 3.14로 값을 주었고, score을 int 형 d로 주었는데, 이를 출력해 결과를 확인해보면 이 문제의 핵심을 알 수 있을 것이다.
정수, 실수등 형변환을 하지않고 계산을 하게된다면 분명히 값 손실이 있을 것이다. 나는 이 부분을 캐치해내지 못했다.
문제 해결은 간단하다. 배열을 선언받아 입력된 값을 저장하고, 최대값을 찾은 후 평균을 구하면 된다.
내가 작성한 코드는 다음과 같다.
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
double [] arr = new double[Integer.parseInt(br.readLine())];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
double max = -100;
for(int i=0; i<arr.length; i++){
arr[i]=Integer.parseInt(st.nextToken());
if(arr[i]>max){
max = arr[i];
}
}
double sum=0;
for(int a=0; a<arr.length; a++){
sum = sum+((arr[a]/max)*100);
}
System.out.println(sum/ arr.length);
}
}
double형 배열을 선언하고, 입력한 값의 크기로 배열의 크기를 지정해주었다.
" " 를 통해 토큰을 구분하고, 과거 사용했던 max의 방법을 이용해 double형 max 변수를 선언했다.
그렇게 한 후 배열 속에 요소를 넣고, max를 이용해 최대값을 찾고, 문제에서 요구한 것처럼 점수를 변환하는 과정, 마지막으로 평균을 구하는 과정까지 도달해 원하는 결과값을 얻을 수 있었다.
윗 방법 외에도 sort를 이용해 문제를 해결할 수 있었다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
double [] arr = new double[Integer.parseInt(br.readLine())];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for(int i=0; i<arr.length; i++){
arr[i]=Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
double sum=0;
for(int a=0; a<arr.length; a++){
sum +=((arr[a]/arr[arr.length-1])*100);
}
System.out.println(sum/arr.length);
sort는 말 그대로 정렬이라는 뜻인데, sort 메소드를 이용해서 더욱 간결하게 코드를 작성할 수 있었고, 조건문을 이용하는 방법이 아닌 sort를 이용해 정렬하게 되면 배열의 맨 마지막 요소가 결국 최댓값일테니 그 요소의 위치를 이용하는 방법이 되겠다.
'알고리즘 및 자료구조 > 백준(BackJoon)' 카테고리의 다른 글
백준 - 8958 번 (0) | 2022.08.09 |
---|---|
백준 - 3052번 (0) | 2022.08.08 |
백준 - 2577번 (0) | 2022.08.05 |
백준 -2562번 (0) | 2022.08.05 |
백준 - 10818번 (0) | 2022.08.05 |