알고리즘 공부
[팁|TIP] 맥OS에서 bits/stdc++.h 사용하기
이번에 새롭게 알고리즘을 공부할 각오를 다지며 책을 샀는데, 첫 장에 떡하니 #include 가 있더라고요. 사실 이 헤더가 존재하고, 알고리즘 사이트와 대회에서 지원되는 경우가 많다고 들어서 전에 쓰려고 했다가 MacOS에서는 자동으로 설치되는 헤더가 아니라서 쓰려고 해도 헤더파일을 못찾는다고 나오더라고요. 그래서 어떻게 추가하는지 찾아보니 Xcode의 헤더파일 폴더 안에 넣는 방법이 가장 많이 떠서 이 방법을 시도해봤는데 여전히 헤더파일이 없다고 해서 2시간 정도의 학교 동아리 시간을 날렸습니다. 그러다가 유튜브를 찾아보니 /usr/local/include에 bits라는 폴더를 만들고 그 안에 stdc++.h 파일을 넣으라는 영상을 찾았습니다. 이 방법은 실행해보니까 인식은 하는 것 같은데 굉장히 긴..
[백준 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..