https://www.acmicpc.net/problem/1049
풀이: 여러 브랜드 중 6줄 패키지 가격의 최솟값과 낱개 가격의 최솟값을 저장해 놓는다.
낱개 * 6 보다 패키지 가격이 더 높다면, 패키지로 살 이유가 없으므로 낱개 가격을 출력한다.
필요한 줄의 갯수가 6개 이하라면, 낱개 가격과 패키지 가격 중 낮은 가격을 출력한다.
둘 다 아니라면, (전체를 패키지로 사는 것) 과 (6개로 나눠지는 만큼 패키지로 사고 나머지는 낱개로 사는 것) 둘 중 낮은 가격을 출력한다.
코드: 사용언어 : c++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <iostream>#include <algorithm>using namespace std; int N, M, q, w, a = 1001, b = 1001, dp[102] = { 0 }; int main(void) { cin >> N >> M; for (int i = 0; i < M; i++) { cin >> q >> w; a = min(a, q); b = min(b, w); } for (int i = 1; i <= N; i++) { dp[i] = (((i - 1) / 6) + 1) * a; dp[i] = min(dp[i], dp[i - 1] + b); } cout << dp[N] << endl; } 코드: 사용언어 : c++
https://www.acmicpc.net/problem/1057
풀이: 1 2
1 2 3 4
1 2 3 4 5 6 7 8
현재 번호가 i 라고 할 때,
위로 갈 수록 배정받는 번호는 (i + 1) / 2 가 된다.
즉, 김지민과 임한수의 번호가 x, y 라고 할 때,
( x + 1 ) / 2 == ( y + 1 ) / 2
가 되는 순간이 둘이 대결하는 순간이다.
토너먼트가 끝날 때까지 둘이 대결하지 않는 경우는 없으므로 -1 출력은 하지않는다.
https://www.acmicpc.net/problem/1074
풀이: 배열의 크기를 점차 줄여가면서,
위에 방문할 수 있는 배열의 크기를 계산하여, 더해가면서 구한다.
ex)
3 7 7
8 * 8 배열에서
왼쪽위, 오른쪽 위, 왼쪽 아래 4 * 4 배열은 필요없으니까 48 만큼 뺀 후,
오른쪽 아래 배열로만 4 * 4 배열로 줄여서 다시 만든다.
그렇다면, ( 7, 7 ) 은 ( 3, 3 )이 되어야 하므로 (7 % 4, 7 % 4) 가 된다.
배열의 크기가 0이 될때까지 반복한다.
https://www.acmicpc.net/problem/11723
풀이: [C++]비트연산자 참고
add : or 연산을 통해 값을 추가한다.
remove : 값이 있는지 확인 후 있다면, xor 연산으로 삭제한다.
check : 값이 있는지 and 연산으로 확인 후 있다면 1, 없다면 0을 출력한다.
toggle : 값이 있다면 삭제하고, 없다면 추가한다.
all : 비트값을 (2^20) - 1 로 바꿔주어, 1 ~ 20 까지 채워놓는다.
empty : 비트값을 0으로 바꿔주어, 공집합으로 만들어놓는다.
시간제한이있으므로 비트마스크를 통해 연산하도록한다. cin, cout 을 사용할 경우 시간초과가 나므로 주의하자.
https://programmers.co.kr
문제: △△ 게임대회가 개최되었습니다. 이 대회는 N명이 참가하고, 토너먼트 형식으로 진행됩니다. N명의 참가자는 각각 1부터 N번을 차례대로 배정받습니다. 그리고, 1번↔2번, 3번↔4번, … , N-1번↔N번의 참가자끼리 게임을 진행합니다. 각 게임에서 이긴 사람은 다음 라운드에 진출할 수 있습니다. 이때, 다음 라운드에 진출할 참가자의 번호는 다시 1번부터 N/2번을 차례대로 배정받습니다. 만약 1번↔2번 끼리 겨루는 게임에서 2번이 승리했다면 다음 라운드에서 1번을 부여받고, 3번↔4번에서 겨루는 게임에서 3번이 승리했다면 다음 라운드에서 2번을 부여받게 됩니다. 게임은 최종 한 명이 남을 때까지 진행됩니다.