포맷팅과 배열의 동적할당(4344)

이영준·2022년 4월 1일
0


소숫점 자리 표시 포맷팅은 항상 덮어두고 살면 잊어버린다.
{:.3f}% -> 소숫점 아래 3번째자리까지 표시하고 그 이하는 반올림한다.

import sys

a = int(input())
for i in range(a):
    case = list(map(int, sys.stdin.readline().split()))
    avg = sum(case[1:]) / case[0]
    cnt=0
    for i in range(1, len(case)):
        if case[i] > avg:
            cnt += 1
    print("{:.3f}%".format(cnt/case[0]*100))

기본적으로 파이썬은 리스트를 동적으로 할당하는 것에 문제가 없다. 컴파일러가 알아서 받은 값마다의 메모리 할당을 해준다. CPP은 vector 혹은 string을 사용하지 않는 이상, 길이가 고정되지 않은 배열은 포인터로 선언해야 한다.

마법의 4줄:
int* arr;
int arrLen;
cin >> arrLen;
arr = new int[arrLen];

위와 같이 작성할 때 프로그램 내에서 배열의 길이를 받아 생성할 수 있다.

#include <iostream>

using namespace std;

int main() {
	int caseNum;
	cin >> caseNum;

	for (int i=0;i<caseNum;i++){
		int num;
		int* arr;
		double arrSum = 0;
		double cnt = 0;
		cin >> num;
		arr = new int[num];
		
		for (int i = 0; i < num; i++) {
			cin >> arr[i];
			arrSum += arr[i];
		}

		double avg = arrSum / num;

		for (int i = 0; i < num; i++) {
			if(arr[i] > avg)
				cnt++;
		}

		cout << fixed;
		cout.precision(3);
		cout << cnt / num * 100 << "%" <<endl;
		cout.unsetf(ios::fixed);
	}
}

같은 결과물에 비해 줄 수의 차이가,,ㄷㄷ
C++의 부동소숫점 설정은 fixed, precision메서드를 통하여 구현할 수 있으며, 마찬가지로 소숫점 자리까지 반올림을 자동으로 해준다.
이후 unsetf함수로 fixed를 해제하여준다.

한가지 더 주의할 점은 배열의 길이에 int형이 아닌 값을 넣으면 컴파일 에러가 날 수 있다. (VS에서는 괜찮았지만..)

profile
컴퓨터와 교육 그사이 어딘가

1개의 댓글

comment-user-thumbnail
2022년 4월 1일

열심히 하는 모습 보기 좋아요

답글 달기