Q. N개의 숫자가 공백 없이 써 있다. 이 숫자를 모두 합해 출력하는 프로그램을 작성하시오.
(난이도: 브론즈 II)
(1) 입력: 1번째 줄에 숫자의 개수 N(1 <= N <= 100), 2번째 줄에 숫자 N개가 공백 없이 주어진다.
(2) 출력: 입력으로 주어진 숫자 N개의 합을 출력한다
- 문제 분석
그렇다면 이 문제에서 해결해야 할 task 3가지는 무엇일까요? 바로
1. 입력 받은 점수를 1차원 배열에 저장하는 것
2. 배열을 탐색하며 최댓값을 구하는 것
3. 점수변환 후 누적합을 구해 평균을 구하는 것
이 세가지가 이 문제에서 해결해야 할 task가 될 것 입니다.
- 코드구현
코드 구현 같은 경우 두 가지 방법으로 준비해 와 봤는데요, 1번부터 보여드리도록 하겠습니다.
1. 필자가 풀이한 방법
저 같은 경우는
(1) 입력을 받는다.
(2) 배열을 공백을 기준으로 쪼갠다
(3) 점수 중 최댓값을 구한다
(4) 점수를 변환함과 동시에 누적합을 구한다
(5) 평균을 출력한다
의 순서로 코드 작성을 하였습니다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// 입력을 받기 위한 scanner 객체 생성
Scanner sc = new Scanner(System.in);
// 과목 수 입력 받기
System.out.print("과목 수를 입력하세요: ");
double s1 = sc.nextDouble();
// (1) 과목 점수 입력 받기 ex) 13 14 15
System.out.print("과목들의 점수를 입력하세요: ");
sc.nextLine(); //버퍼에 담긴 enter 즉 \n을 제외해 주기 위함
String s2 = sc.nextLine(); // 문자열 "13 14 15"를 받아 s2 변수에 저장
System.out.println(s1);
System.out.println(s2);
//(2) space를 기준으로 문자열을 split해 각각의 요소들을 배열 arr에 담음
String arr[] = s2.split(" ");
System.out.println(arr.length);
//(3) 점수의 최댓값 구하기
double max=Double.parseDouble(arr[0]);
for(int i = 1; i < arr.length; i++) {
double num = Double.parseDouble(arr[i]);
if (max < num)
max = num;
}
// (4) 문자열의 길이만큼 for문을 순회하며 즉 0부터 (배열길이-1)만큼의 인덱스를 돌며, 각 인덱스에 있는 문자를 가지고 와 점수를 변환하고 누적합을 구함
int total = 0;
for(int i = 0; i < arr.length; i++) {
int num = Integer.parseInt(arr[i]);
double score = num / max * 100; //변환된 점수
total += score; //변환된 점수를 합산
}
//(5) 최종 평균 출력
System.out.println("결과값은: "+(total/s1));
}
}
출력 화면은 다음과 같습니다.
2. 코드를 줄여서 작성한 방법
이 문제에 점수를 변환하고 총합을 구한 후 평균을 구하는 부분의 수식을 줄이면 코드를 훨씬 적고 깔끔하게 작성할 수 있는데요, 기존에 1번에서는 평균을 구하는 부분을 아래와 같이 구했었습니다.
// (4) 문자열의 길이만큼 for문을 순회하며 즉 0부터 (배열길이-1)만큼의 인덱스를 돌며, 각 인덱스에 있는 문자를 가지고 와 점수를 변환하고 누적합을 구함
int total = 0;
for(int i = 0; i < arr.length; i++) {
int num = Integer.parseInt(arr[i]);
double score = num / max * 100; //변환된 점수
total += score; //변환된 점수를 합산
}
//(5) 최종 평균 출력
System.out.println("결과값은: "+(total/s1));
이를 좀 더 깔끔하게 줄여보면 아래와 같습니다.
//문자열의 길이만큼 for문을 순회하며 즉 0부터 (배열길이-1)만큼의 인덱스를 돌며, 인덱스에 있는 문자를 가지고 점수를 변환하고 누적합을 구함
int total = 0;
for(int i = 0; i < arr.length; i++)
total += Integer.parseInt(arr[i]); //변환된 점수를 합산
//최종 평균 출력
System.out.println("결과값은: "+(total*100/max/s1));
이랗게 for문으로는 총합만 구하고, 뒤에 println 함수 안에서의 식으로 한 번에 점수를 변환시키고 평균을 구하는 것이죠. 그럼 어떻게 이러한 수식이 가능한지 한 번 살펴볼까요?
위 수식에서 A,B,C를 모두 점수라고 하였을 때, 기존에 우리는 A/M*100을 통해 점수를 변환한 후 이를 모두 합산에 3으로 나누어 평균을 구했습니다. 이러한 수식은 등식의 오른쪽 부분과 같이도 나타낼 수 있는데, 코드상으로 총합을 먼저 구한 뒤에 나머지 변환과 평균 연산을 해 주면 훨씬 깔끔해지겠죠?
출력 결과를 보시면
잘 나오죠? 오늘 코딩테스트 마무리 하겠습니다 :)
'Coding Test' 카테고리의 다른 글
Do it 코딩 테스트: 구간 합 구하기 (0) | 2023.09.14 |
---|---|
do it 코딩 테스트: 숫자의 합 구하기 (0) | 2023.09.08 |