[BOJ] 1546. 평균 (C, Python3)
- 코딩 초보. 구현을 목표로 해서 코드가 비효율적일 수 있습니다.
1546. 평균
세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그리고 나서 모든 점수를 점수/M*100으로 고쳤다.
예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다.
세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.
첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다.
첫째 줄에 새로운 평균을 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-2 이하이면 정답이다.
1.C99
아래는 내가 c언어로 뻘짓한 코드이다. 아래 코드의 경우
4
10 20 0 100을 입력하면
0에 걸려서 100이 배열에 저장되지 않는 사태가 발생한다..
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main() {
int n,m,k,start;
double max, sum=0,len=0;
scanf("%d\n", &n);
double s[1000];
char a[1000];
gets(a);
//점수 배열에 넣기
for (int i = 0,j=0;a[i];) {
if (a[i] != ' ') {
m = 0;
k = i;
start = k;
for (; a[k] != ' ' &&a[k]!='\0'; k++) {
m++;
i++;
}
if (m == 3) a[j] = 100;
else if (m == 2) s[j] = (a[start] - '0') * 10 + a[start+1] - '0';
else if (m == 1) s[j] = a[start] - '0';
j++;
}
if (a[i+1] == ' ' || a[i]==' ') i++;
}
max = s[0];
//최고 점수 찾기
for (int i = 0; s[i]; i++) {
if (s[i] > max) max = s[i];
}
for (int i = 0; s[i]; i++) {
s[i] = (s[i] / max) * 100;
len++;
}
for (int i = 0; s[i]; i++) {
sum += s[i];
}
printf("%f", sum / len);
}
왜 이렇게 풀었었냐면 점수를 문자열로 입력받아서 공백을 기준으로 잘라서 하나하나 넣으려고 했는데 이러면 0에서 걸려버리므로..다르게 풀어야한다.
사실 더 쉽게 풀 수 있었는데 내가 너무 어렵게 생각했던 것 같다. 아래가 내가 최종적으로 제출한 코드이다.
#include <stdio.h>
main() {
int n;
double max, sum=0;
scanf("%d\n", &n);
double s[1000];
for (int i = 0; i < n; i++) {
scanf("%lf", &s[i]);
}
max = s[0];
for (int j = 0; j < n; j++) {
if (s[j] > max) max = s[j];
}
for (int i = 0; i < n; i++) {
s[i] = (s[i] / max) * 100.0;
sum += s[i];
}
printf("%.2f", sum / n);
}
나는 scanf를 저렇게 적으면 30 40 60 을 적고
다시 엔터를 누르면 또 불러오는 줄로 알고 있었는데 그게 아니였다. scanf("%d", &s[i])로 하면, 엔터 (그러니까 공백 문자) 로 인식되어서 for반복문의 i가 증가하면서 입력을 받는다.
차례대로 s 배열에 점수 값을 저장하고, 이후 점수 최댓값(max)를 찾는다. 다음으로 반복문을 통해 해당 계산을 연산하여 출력하도록 하면 된다.
(C) 코드를 작성하며 헷갈렸던 개념, 오개념
scanf 를 double 형으로 받을 경우 %lf로 해야한다.
이유 참고: ( https://luyin.tistory.com/276)
출력(printf)의 경우 double이나 float 모두 구분 없이 %f로 출력해도 되지만, scanf는 void형의 포인터를 받으므로 무슨 형식인지에 대한 정보를 구분해서 알려줘야 한다.
2.Python
n=int(input())
score=list(map(int,input().split()))
maxS=max(score)
for i in range(n):
score[i]=score[i]/maxS*100
print(sum(score)/n)
함수 조금만 쓰면 금방 구현 가능하다.
브론즈 5,4를 지금까지 쭉 풀어왔었는데 난이도가 너무 쉽기도 하고..넘 많기도 해서 브론즈 2, 1부터 좋은 문제 몇개 추려서 풀어보기로 했다. 아자아자 파이팅!
'💻STUDY > BOJ' 카테고리의 다른 글
[BOJ] 2908. 상수 (C,Python3) (0) | 2022.01.15 |
---|---|
[BOJ] 2577. 숫자의 개수 (C, Python3) (0) | 2022.01.14 |
[BOJ] 1157. 단어 공부 (C) (0) | 2022.01.14 |
[BOJ] Bronze IV 부수기: 열일곱번째 날 (0) | 2022.01.12 |
[BOJ] 1152. 단어의 개수 (0) | 2022.01.12 |
댓글