본문 바로가기

Programming/BOJ

(42)
[백준/Python] 1715번: 카드 정렬하기(최소힙) import sys import heapq # input N = int(input()) arr = [] for i in range(N): arr.append(int(input())) # process answer = 0 heapq.heapify(arr) while True: if len(arr) == 1: break n1 = heapq.heappop(arr) n2 = heapq.heappop(arr) n3 = n1+n2 answer += n3 heapq.heappush(arr,n3) print(answer)
[백준/Python] 백준 1697번 숨바꼭질 from collections import deque N, K = map(int, input().split()) visit = [False]*100001 cur = N time = 0 q = deque([[cur,time]]) while q: v = q.popleft() cur, time = v[0], v[1] if visit[cur] == False: if cur == K: print(time) break visit[cur] = True if cur + 1 = 0: q.append([cur-1, time+1]) if cur*2
[백준/C++] 11724번: 연결 요소의 개수 (DFS) 바이러스 문제와 동일 #include using namespace std; int map[1001][1001]; int visit[1001]; int N, M; int ans = 0; void dfs(int x) { visit[x] = 1; for (int i = 1; i > N >> M; for (int j = 0; j > x >> y; map[x][y] = 1; map[y][x] = 1; } for (int i = 1; i
[백준/C++] 1654번: 랜선자르기 (이분탐색) 앞 문제와 같다. long long 자료형으로 써야 틀렸습니다를 안만난다. #include #include using namespace std; int N, K; long long lan[10001]; bool condition(int mid) { int sum = 0; for (int i = 0; i = K) return true; return false; } int main() { cin >> N >> K; long long left = 1; long long right = 0; for (int i = 0; i > lan[i]; right = max(lan[i], right); } long l..
[백준/C++] 2805번: 나무 자르기 (이분탐색) long long 자료형을 안쓰면 틀린다. #include #include #include using namespace std; const int MAX = 1000000; int N; long long M; //나무 수, 나무 길이 long long tree[MAX]; bool condition(long long height) { // 앞부분에 존재하는지판단 long long sum = 0; for (int i = 0; i height) sum += tree[i] - height; } if (sum >= M) return true; return false; } int main() { ios_base::sync_with_stdio(0); cin.tie(0);..
[백준/C++] 2661번: 좋은수열 (DFS, 백트랙킹) DFS로 완전탐색을 하되 유망하지 않으면 탐색을 포기하는 기법을 백트랙킹이라고 한다. 이 문제도 역시 백트랙킹으로 푸는 문제이다! 1) 출력할 숫자를 어디에 담을 것인가? -> string에 계속 더해가자. 2) 가지치기 조건은? -> 부분수열이 같은지 체크해서 유효한 수일 때만 dfs! ( 반만 체크하면 된다.) **substr(pos, cnt) pos 위치부터 cnt 갯수만큼의 sub-string을 return #include #include using namespace std; int endFlag = 0; int N; bool isValid(string result) { int len = result.size(); int end = len - 1; for (int i = 1; i
[백준/C++] 1929번: 소수 구하기 (여러가지 소수 판별법) 제일 큰 수가 1,000,000으로 for문을 돌며 모든 수를 검사하면 시간초과가 난다. 2가지 방법으로 시간을 줄여보자. (+ endl 쓰면 모든 방법에서 시간초과 나니 '\n'로..) 1. 에라토스테네스의 체 방법 2부터 시작해서 해당 수를 제외한 해당 수의 배수들을 제거한다. #include using namespace std; #define size 1000001 int a[size] = { 0,1 }; int main() { int M, N; cin >> M >> N; for (int i = 2; i
[백준/C++] 9095번: 1,2,3 더하기 (DFS/DP) 1) DFS (모든 조합 체크) #include using namespace std; int test_case, N; int cnt = 0; void solve(int sum) { if (sum == N) { cnt++; return; } if (sum > N) return; for (int i = 1; i > test_case; for (int i = 0; i > N; solve(0); cout test_case; for (int i = 0; i > N; cnt = 0; for (int i = 4; i