본문 바로가기

전체 글

(277)
백준 4796 - 캠핑 www.acmicpc.net/problem/4796 V일의 휴가 중에서 캠핑장을 최대 며칠이나 즐길 수 있을지 구하는 문제이다. 연속하는 P일 중 L일 동안 사용이 가능하다 명시했으므로 V를 P로 나누면 캠핑장을 L일동안 쓸 수 있는 횟수가 나오게 될 것이다. 이때 나머지는 min(mod, L) 계산을 통해 나머지 일 수 중에서 캠핑을 즐길 수 있는 날을 더해주면 답을 구할 수 있다. 최종 수식 $ANSWER = \lfloor V \div P \rfloor \times L + min(V mod P, L)$ 전체코드 #include #include using namespace std; using ll = long long; int main() { int l, p, v; cin >> l >> p >> v; ..
백준 12915 - 대회 개최 www.acmicpc.net/problem/12915 5개의 난이도에 해당하는 문제 수가 주어질 때 최대로 개최할 수 있는 대회의 수를 구해야 하는 문제이다. 대회를 개최하기 위해서는 쉬움, 중간, 어려움 난이도의 문제가 하나씩 배정되어야만 한다. 매개변수로 주어지는 e, m, h는 배정될 수 있는 난이도가 한가지로 정해져 있으므로 나머지 em, mh에 대해 난이도를 적절히 분배하는 방법을 찾는게 핵심이다. 방법 1. 남아있는 e, m, h를 우선적으로 배정하도록 한다. 2. 남아있는 e, m, h가 없을 경우 em, mh 중에서 배정하도록 한다. 2 - 1. 쉬움은 em을 주고 어려움은 mh를 주면 되는데 중간의 경우는 em과 mh중 더 많이 남아있는 문제를 배정하고 만약 두 난이도가 동일한 갯수만큼 ..
백준 1629 - 곱셈 www.acmicpc.net/problem/1629 $A^{B} \mod C$ 를 빠르게 구해야 하는 문제이다. 단순하게 반복문을 통해 구한다고 하면 최대 2,147,483,647번 연산해야 하므로 이는 시간 내로 해결이 불가능하다. 따라서 해결을 위해서는 다른 방법이 필요하다. 이 문제 해결에 사용되는 알고리즘은 PS를 하는데 기본 소양이 되므로 그 방법을 잘 익히도록 한다. 예시로 $2^{1024}$를 구한다고 가정해보자. $2^{1024}$는 $2^{1024} = 4^{512}$ 으로 나타낼 수 있다. 그러면 $4^{512}$도 $4^{512} = 8^{256}$ 으로 나타낼 수 있다. 이처럼 지수를 절반씩 쪼개가며 제곱하면 $O(\log n)$의 시간복잡도로 빠르게 계산할 수 있다. 지수를 절반으..
백준 10250 - ACM 호텔 www.acmicpc.net/problem/10250 문제에서 손님이 아랫층이면서 엘리베이터에 가까운 순으로 타는 것을 선호한다는 것을 알 수 있고 첫번째 예시를 도식화 하면 6 ... 5 ... 4 10 ... 3 9 ... 2 8 ... 1 7 ... 표와 같이 10번 위치인 402호에 들어가게 된다. 따라서 해당 손님이 들어갈 위치를 탐색하여 그 위치의 층과 호수를 계산해주면 된다. 전체코드 더보기 #include int main() { using std::cout; using std::cin; int n; cin >> n; int h, w, m; while (n--) { int sonnom(1); cin >> h >> w >> m; while (m - h > 0) { m -= h; ++sonnom..
백준 2688 - 줄어들지 않아 www.acmicpc.net/problem/2688 2688번: 줄어들지 않아 문제 어떤 숫자가 줄어들지 않는다는 것은 그 숫자의 각 자리 수보다 그 왼쪽 자리 수가 작거나 같을 때 이다. 예를 들어, 1234는 줄어들지 않는다. 줄어들지 않는 4자리 수를 예를 들어 보면 0011, www.acmicpc.net 각 자리의 숫자들이 단조 증가하는 수열을 구하는 문제이다. 1의 자리 숫자들은 문제에서 이야기하는 줄어들지 않음을 만족하므로 그 갯수를 1로 채우고 바텀업 DP를 통해 나머지 자리수들의 값을 채워나가면 된다. #include using namespace std; using ll = long long; ll dp[10][64]; int main() { for (int a = 0; a < 10; ++..