== 소감 == * 통과O * double형의 정밀도때문에 계속 삽질했음(예를 들어 9.03의 경우 9.029999999999...으로 입력됨). 지식검색 결과 컴퓨터구조상 어쩔 수 없다고 함. 문자열로 입력받는 방법말고 좋은 해결 방법있으면 가르쳐주세요. * double형 함부로 쓸 게 못된다는걸 뼈저리게 느낌 * 알고리즘 - 평균값을 구한다음에 평균값보다 많이 쓴 돈(평균값 넘는 돈 - 평균값)이 이동하면 됨 == 소스 == {{{~cpp #include using namespace std; int main() { int n; // 학생 수 int student[1000]; // 학생들이 사용한 돈 int total; // 총합 int aver; // 평균 int studentExchanged[1000]; // 공평하게 이동된 후의 학생들이 쓴 돈 int exchange; // 전체 이동되는 돈 int temp; int i, j; while (cin >> n && n != 0) { total = 0.0; exchange = 0.0; temp = 0.0; for (i = 0; i < n; i++) { double input; cin >> input; student[i] = (input + 0.005) * 100; total += student[i]; } aver = total / n; for (i = 0; i < n; i++) { if (student[i] != aver) temp += student[i] - aver; studentExchanged[i] = aver; } for (i = 0; temp >= 1 && i < n; i++) { if (studentExchanged[i] == aver) { studentExchanged[i] = aver + 1; temp -= 1; } } // 정렬 for (i = 0; i < n - 1; i++) for (j = i + 1; j < n; j++) { if (student[i] > student[j]) { int temp; temp = student[i]; student[i] = student[j]; student[j] = temp; } if (studentExchanged[i] > studentExchanged[j]) { int temp; temp = studentExchanged[i]; studentExchanged[i] = studentExchanged[j]; studentExchanged[j] = temp; } } for (i = 0; i < n; i++) { if (studentExchanged[i] > student[i]) { exchange += studentExchanged[i] - student[i]; } } cout.setf(ios::fixed); cout.precision(2); cout << "$" << (exchange / 100.0) << endl; } return 0; } }}} == 댓글 == ---- [TheTrip]