정보올림피아드

    [백준 17612번-파이썬] 쇼핑몰

    http://acmicpc.net/problem/17612 {코드} import heapq import sys input = sys.stdin.readline n, k = map(int, input().split()) cus = [] items = [] for _ in range(n): customer, item_cnt = map(int, input().split()) cus.append(customer) items.append(item_cnt) counter = [] for i in range(k): heapq.heappush(counter, (0, i)) time_needed = [0] * k finished = [] for i in range(n): t, x = heapq.heappop(counte..

    [백준 21760번-파이썬] 야구 시즌

    http://acmicpc.net/problem/21760 {코드} for _ in range(int(input())): n, m, k, d = map(int, input().split()) b = 2*d//(k*n*m*(m-1) + m*m*n*(n-1)) if b: print(m*(m-1)*n*k*b//2 + m*m*n*(n-1)*b//2) else: print(-1) {설명} A와 B의 관계를 알고, k가 주어지기 때문에 다음과 같은 식이 성립합니다. A*N*(M*(M-1))/2 + B*(N*(N-1))/2)*M*M

    [백준 19942번-파이썬] 다이어트

    http://acmicpc.net/problem/19942 {코드} def calculate(do, picked, pick_sum): global chosen, tot_prc if pick_sum[4] >= tot_prc: return for i in range(4): if req_nut[i] > pick_sum[i]: break else: chosen = picked.copy() tot_prc = pick_sum[4] return if do == n: return picked.append(do+1) for i in range(5): pick_sum[i] += nuts[do][i] calculate(do+1, picked, pick_sum) picked.pop() for i in range(5): pic..

    [백준 19941번-파이썬] 햄버거 분배

    http://acmicpc.net/problem/19941 {코드} n, k = map(int, input().split()) placement = list(input()) ans = 0 for idx in range(n): if placement[idx] == 'P': for i in range(max(idx-k, 0), min(idx+k+1, n)): if placement[i] == 'H': placement[i] = 0 ans += 1 break print(ans) {설명} 이 문제는 간단히 사람의 위치에서 양쪽으로 k의 범위(±k)에서 가장 왼쪽에 있는 햄버거를 고르면 되는 문제입니다. 가장 왼쪽을 고르는 이유는 맨 마지막 위치에 사람이 있다면 그 사람은 왼쪽에서만 햄버거를 찾아야하기 때문에 최..

    [백준 20191번-C++] 줄임말

    http://acmicpc.net/problem/20191 {코드} #include #include #include using namespace std; int solution() { string S, T; cin >> S; cin >> T; vector next(26); for (int i = 0; i < T.length(); i++) { next[T[i]-'a'].push_back(i); } int chkCnt = 0, chkIdx; for (int i = 0; i < 26; i++) { if (!next[i].empty()) {chkCnt++; chkIdx = i;} } if (chkCnt == 1 && T[chkIdx] == S[0]) return (S.length()+T.length()-1)/T..

    [백준 17609번-C++] 회문

    http://acmicpc.net/problem/17609 {코드} #include #include using namespace std; string s; int isPalindrome(int left, int right, bool testPseudo) { while (left < right) { if (s[left] != s[right]) { if (testPseudo) { if (isPalindrome(left+1, right, false) == 0 || isPalindrome(left, right-1, false) == 0) return 1; } return 2; } left++; right--; } return 0; } int main() { ios_base::sync_with_stdio(fals..

    [백준 17608번-C++] 막대기

    http://acmicpc.net/problem/17608 {코드} #include using namespace std; int main() { int rods[100001], n; scanf("%d", &n); for (int i=0; i=0; i--) { if (max < rods[i]) { max = rods[i]; cnt++; } } printf("%d\n", cnt); } {설명} 이 문제에서는 모든 막대기를 일렬로 나열한 후 오른쪽에서 보기 때문에 어떤 막대기는 오른쪽에 있는 모든 막대기보다 크면 보이게 되는 것입니다. 우선, 가장 오른쪽의 막대기, 즉, 마지막 인덱스의 막대기는 무조건 보이므로 이를 max값으로 잡고 왼쪽으로 하나씩 이동하며 만약 이 max값보다 막대기의 길이가 더 크면 ma..

    [백준 19940번-파이썬/Python] 피자 오븐

    http://acmicpc.net/problem/19940 {코드}for _ in range(int(input())): n = int(input()) buttons = [0]*5 sixties, tens, ones = n//60, (n % 60)//10, n % 10 if ones > 5: tens += 1 ones -= 10 if tens > 3: sixties += 1 tens -= 6 if tens = 0)] = abs(tens) buttons[4-(ones >= 0)] = abs(ones) print(*buttons){설명}먼저 각 버튼을 누를 횟수를 저장할 ..

    [백준 19939번-파이썬/Python] 박 터뜨리기

    http://acmicpc.net/problem/19939 {코드} def solution(): n, k = map(int, input().split()) sum_minimum = k*(k+1)//2 if sum_minimum > n: return -1 if (n-sum_minimum) % k == 0: return k-1 else: return k print(solution()) {설명} K개의 바구니에 들어있는 공의 개수가 1개 이상이며 전부 달라야 하기 때문에 공의 최솟값은 k(k+1)/2이다. 그림처럼 각 바구니가 순서대로 공의 개수가 결정된다면 전의 바구니보다 1개 더 많을 때가 최소이기 때문이다. 그렇다면 최솟값보다 공의 개수가 적으면 -1을 반환하면 된다. 공의 개수가 더 많을 경우 1부터 ..