본문 바로가기

ALGORITHM

[백준 4344 Java] 변수 선언 / 초기화 위치에 따른 변화 + 소수점 n째 자리까지 출력하기

변수의 초기화 위치에 따라 다른 값이 나와 헷갈렸던 문제.

단순한 문제인데 그동안 변수 선언과 초기화에 대해 아무 생각 없이 코딩했던 것 같아 정리하고자 한다.

 

일단, 아래 예제는 정답이다.

일부 변수(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);