변수의 초기화 위치에 따라 다른 값이 나와 헷갈렸던 문제.
단순한 문제인데 그동안 변수 선언과 초기화에 대해 아무 생각 없이 코딩했던 것 같아 정리하고자 한다.
일단, 아래 예제는 정답이다.
일부 변수(c, score)는 전역 변수로 선언과 초기화를 한 번에 한 반면,
일부 변수(n, total, count, avg)는 전역 변수로 선언만 하고 초기화는 for문 안에서 한 것을 볼 수 있다.
for문 안에서 초기화를 한 이유는, 큰 for문을 한 바퀴 돌면 하나의 테스트 케이스가 실행된 것이기 때문에
다시 돌 때는 새로운 값들로 초기화가 되어야 하기 때문에 for문 바로 아래에 초기화가 된 것을 확인할 수 있다.
더 좋은 방법은 for문 안에서만 사용하는 변수는 for문 안에서 선언하고 초기화하는 것!
전체적으로 사용하는 변수만 전역변수로 두자.
import java.util.Scanner;
public class Ex7 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int c = sc.nextInt(); // 테스트 케이스
int n, total , count; // 학생 수, 전체 점수 합계, 평균 이상의 학생 수
double avg; // 전체 점수 평균
int[] score = new int[1000]; // 입력한 학생 수(n)만큼 학생들의 점수가 담길 배열
for(int i = 0; i < c; i++) { // 테스트 케이스만큼 돌리기
n = sc.nextInt(); // 학생 수를 입력 받는다
total = 0; // 테스트 케이스가 하나씩 증가할때마다 변수 초기화
count = 0; // 테스트 케이스가 하나씩 증가할때마다 변수 초기화
for(int j = 0; j < n; j++) { // 학생 수 만큼 해당 for문 돌리기
score[j] = sc.nextInt(); // 이 for문은 학생 각각의 점수를 받는다
total += score[j]; // 받은 점수를 다 더해서 total에 넣는다
}
avg = total / n; // 평균을 구한다
for(int j = 0; j < n; j++) {
if(score[j] > avg) { // 평균보다 큰 점수를 가진
count++; // 학생의 수를 구한다
}
}
System.out.printf("%.3f%%\n", 100.0 * count / n); // 평균 이상의 학생 평균
} // 여기까지 이제 하나의 테스트 케이스 끝남. 입력받은 c만큼 이 과정 반복하자.
}
}
아래의 예제는 오답이다.
total과 count는 for문을 한 바퀴 돌 때마다 초기화되어야 하는 변수인데 전역변수에 선언해버리면
값이 계속 쌓이게 되서 처음 값은 제대로 나와도 그다음 값부터 잘못된 값이 나오게 된다.
public class Ex7 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int c = sc.nextInt();
int n;
// 달라진 부분 : 선언과 초기화를 전역변수에 함
int total = 0;
int count = 0;
double avg;
int[] score = new int[1000];
for(int i = 0; i < c; i++) {
n = sc.nextInt();
for(int j = 0; j < n; j++) {
score[j] = sc.nextInt();
total += score[j];
}
avg = total / n;
for(int j = 0; j < n; j++) {
if(score[j] > avg) {
count++;
}
}
System.out.printf("%.3f%%\n", 100.0 * count / n);
}
}
}
소수점 n째 자리까지 출력하기
문제에서는 값을 33.333%와 같이 출력하라고 명시하고 있다.
값을 소수점 셋째 자리까지 출력하기 위해서는 %.3f와 같이 표현할 수 있다.
또한, 맨 뒤에 %를 출력하기 위해서는 %%와 같이 표현해야 한다.
System.out.printf("%.3f%%\n", 100.0 * count / n);
'ALGORITHM' 카테고리의 다른 글
재귀 함수 (0) | 2020.12.30 |
---|---|
[백준 2908 Java] 문자열 뒤집기 - StringBuffer / StringBuilder (0) | 2020.12.29 |
[백준 10809 Java] indexOf() (0) | 2020.12.28 |
[백준 2577 Java] String / char / int 형변환 (0) | 2020.12.23 |
[백준 10951 Java] While문 EOF (0) | 2020.12.23 |