💻STUDY/BOJ

[BOJ] 1546. 평균 (C, Python3)

coldNoodlePigeon 2022. 1. 14.
  • 코딩 초보. 구현을 목표로 해서 코드가 비효율적일 수 있습니다. 

1546. 평균

세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그리고 나서 모든 점수를 점수/M*100으로 고쳤다.

예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다.

세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.

 

첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다.

 

첫째 줄에 새로운 평균을 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-2 이하이면 정답이다.

 


1.C99 

 

아래는 내가 c언어로 뻘짓한 코드이다. 아래 코드의 경우

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

댓글