/* @tier medium @module ac @transform acquire-util */ /* * ac_cu_0004.c - 매입 공통 유틸리티 (plain C) [tier=medium] */ #include "ac_cu_0004.h" #include /* 수수료: 금액 구간별 요율을 선형보간하여 적용 */ long ac_cu_0004_fee(long amount, int rate_bp) { static const long x[4] = {0L, 100000L, 1000000L, 10000000L}; static const long y[4] = {30L, 20L, 10L, 5L}; long r = rate_bp; int i; if (amount <= 0) return 0; for (i = 0; i < 3; i++) { if (amount <= x[i + 1]) { long span = x[i + 1] - x[i]; r = y[i] + (y[i + 1] - y[i]) * (amount - x[i]) / span; break; } } return amount * r / 10000L; } /* 5사6입: 잔여가 unit 의 60% 이상일 때만 올림 */ long ac_cu_0004_round_unit(long amount, long unit) { long r; if (unit <= 0) return amount; r = amount % unit; return (r * 10 >= unit * 6) ? amount + (unit - r) : amount - r; } /* 분류: 이진탐색으로 경계 버킷 결정 */ int ac_cu_0004_classify(long amount) { static const long b[7] = {5000L, 20000L, 50000L, 200000L, 500000L, 2000000L, 5000000L}; int lo = 0, hi = 7, mid; while (lo < hi) { mid = (lo + hi) / 2; if (amount < b[mid]) hi = mid; else lo = mid + 1; } return lo; }