백준

    [백준 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

    [백준 21756번-파이썬] 지우개

    http://acmicpc.net/problem/21756 {코드} from math import log2, ceil n = log2(int(input())) print(int(2**int(n))) # --- # from math import log2 print(int(2**log2(int(input())))) {설명} 주어진 수가 n일때 답은 2^m

    [백준 18870번-파이썬] 좌표 압축

    http://acmicpc.net/problem/18870 {코드} n = int(input()) org = tuple(map(int, input().split())) ans = {k: i for i, k in enumerate(sorted(set(org)))} [print(ans[k], end=' ') for k in org] {설명} 압축될 숫자는 결국 주어진 값들을 정렬했을 때 그 숫자의 인덱스와 같습니다. 여기서 수들을 중복없이 정렬해야하기에 집합으로 만든 후 정렬하고 값을 키, 값의 인덱스를 value로 해서 딕셔너리를 생성합니다. 이후 각 값에 대해 딕셔너리에서의 value를 출력하면 됩니다.

    [백준 10773번-파이썬] 제로

    http://acmicpc.net/problem/10773 {코드} st = [] for _ in range(int(input())): c = int(input()) if c == 0 and len(st): st.pop() elif c != 0: st.append(c) print(sum(st)) {설명} 이 문제는 간단히 입력에 따라 행동하면 되는 문제입니다. 입력이 0이면 숫자를 빼면 되고 0이 아니면 바로 배열에 넣어주면 되죠. (0일때 무조건 지울 수 있는 숫자가 보장되긴 하는데 그냥 배열 길이 확인하는 것까지 추가했습니다. len이 O(1)이라 큰 상관은 없습니다.) 마지막에는 배열 안의 값들의 합을 출력하기 위해 sum함수를 사용하여 출력하면 됩니다.

    [백준 4949번-파이썬] 균형잡힌 세상

    http://acmicpc.net/problem/4949 {코드} while True: s = input() if s == '.': break st = [] for i in s: if i not in '()[]': continue if i == '(' or i == '[': st.append(i) elif (i == ')' and st and st[-1] == '(') or (i == ']' and st and st[-1] == '['): st.pop() else: st.append(0) break print('no' if st else 'yes') {설명} 이 문제는 간단한 스택 문제로 뭘 스택에 넣고 뭘 무시하면 되는지 파악하면 간단히 풀 수 있는 문제입니다. 먼저 문자열을 입력받은 후 하나씩 돌면서..

    [백준 2580번-파이썬] 스도쿠

    http://acmicpc.net/problem/2580 {코드} import sys board = [list(map(int, input().split())) for _ in range(9)] zeros = [(i, j) for i in range(9) for j in range(9) if board[i][j] == 0] def get_possibles(r, c): possibles = set(range(1, 10)) possibles -= set(board[r]) test = set() for i in range(9): test.add(board[i][c]) possibles -= test test = set() for i in range(r//3*3, r//3*3+3): for j in range(c..

    [백준 1062번-파이썬/Python] 가르침

    http://acmicpc.net/problem/1062 {코드} from itertools import combinations n, k = map(int, input().split()) if k < 5: print(0) else: k -= 5 nece_chars = {'a', 'n', 't', 'i', 'c'} input_chars = [] alpha = {ky: v for v, ky in enumerate( (set(map(chr, range(ord('a'), ord('z')+1))) - nece_chars))} cnt = 0 for _ in range(n): tmp = 0 for c in set(input())-nece_chars: tmp |= (1

    [백준 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)에서 가장 왼쪽에 있는 햄버거를 고르면 되는 문제입니다. 가장 왼쪽을 고르는 이유는 맨 마지막 위치에 사람이 있다면 그 사람은 왼쪽에서만 햄버거를 찾아야하기 때문에 최..