본문 바로가기

분류 전체보기

(123)
1966번: 프린터큐 (구현, 큐) - Fastcampus www.acmicpc.net/problem/1966 1966번: 프린터 큐 첫 줄에 test case의 수가 주어진다. 각 test case에 대해서 문서의 수 N(100이하)와 몇 번째로 인쇄되었는지 궁금한 문서가 현재 Queue의 어떤 위치에 있는지를 알려주는 M(0이상 N미만)이 주어진다. 다음 www.acmicpc.net from collections import deque def run(N, M, a): qu = deque([(p, i) for i, p in enumerate(a)]) # 큐 cnt = 0 while qu: cp, ci = qu.popleft() if all(cp >= p for p, i in qu): # 중요도가 최대값이면 출력 cnt += 1 if ci == M: return..
1874번: 스택수열 (구현, 스택) - Fastcampus www.acmicpc.net/problem/1874 1874번: 스택 수열 1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다. www.acmicpc.net import sys def run(N, a): res = [] i, st = 1, [] # 스택 for x in a: while x >= i: st.append(i) res.append("+") i += 1 if st[-1] == x: st.pop() res.append("-") else: return ["NO"] return r..
2798번: 블랙잭 (구현, 반복) - Fastcampus www.acmicpc.net/problem/2798 2798번: 블랙잭 첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는다. 합이 M을 넘지 않는 카드 3장을 찾을 수 있� www.acmicpc.net def run(N, M, a): max_v = 0 for i in range(N): for j in range(i + 1, N): for k in range(j + 1, N): s = a[i] + a[j] + a[k] if s
2920번: 음계 (구현, 반복) - Fastcampus www.acmicpc.net/problem/2920 2920번: 음계 다장조는 c d e f g a b C, 총 8개 음으로 이루어져있다. 이 문제에서 8개 음은 다음과 같이 숫자로 바꾸어 표현한다. c는 1로, d는 2로, ..., C를 8로 바꾼다. 1부터 8까지 차례대로 연주한다면 ascending, 8�� www.acmicpc.net def run(a): ascending = True descending = True for i in range(len(a) - 1): if a[i] > a[i + 1]: ascending = False elif a[i] < a[i + 1]: descending = False if ascending: return "ascending" elif descending: re..
3-2. [그래프 탐색] Kruskal, Prim (최소신장트리) 크루스칼 빠른 간선 순서로 탐색한다 (결과값: 최소신장트리에 해당하는 간선 리스트) 단, 사이클을 만들지 않아야 한다 간선의 두 정점이 서로 다른 분리집합에 있어야 한다 graph = { "vertices": ["A", "B", "C", "D"], "edges": [ (6, "A", "B"), (3, "A", "C"), (2, "B", "C"), (1, "B", "D"), (9, "C", "D"), ], } def find(x): if parent[x] != x: parent[x] = find(parent[x]) return parent[x] def union(x, y): rx = find(x) ry = find(y) if rx != ry: parent[ry] = rx def kruskal(): # 1...
3-1. [그래프 탐색] BFS (전체탐색) Dijkstra (최단거리) BFS 인접 정점 순서로 탐색한다 (결과값: 모든 정점) 구현방법: 인접 정점을 큐에 추가... 반복 자료구조: 큐와 visited 테이블 문제유형 모든 정점 탐색 => 탐색된 모든 정점의 개수 , 정점의 리스트 특정 정점 탐색 => 특정 정점에 도달하는 가장 빠른 탐색횟수, 가장 빠른 탐색경로 # [방법 1] 큐에서 꺼내고 방문처리 from collections import deque graph = { "A": ["B", "C"], "B": ["A", "C", "D"], "C": ["A", "B", "D"], "D": ["B", "C"], } S = 'A' qu = deque([S]) visited = [] while qu: node = qu.popleft() if node not in visited:..
2-1. [정렬], [이분탐색] 1. 선택정렬 (최소값을 찾아서 하나씩 넣는다) def find_min_idx(a): min_i = 0 for i in range(1, len(a)): if a[i] < a[min_i]: min_i = i return min_i # 선택정렬: 최소값을 찾아서 하나씩 넣는다... O(N^2) def sel_sort(a): rst = [] while a: i = find_min_idx(a) v = a.pop(i) rst.append(v) return rst d = [2, 4, 5, 1, 3] print(sel_sort(d)) a = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8] N = len(a) for i in range(N - 1): min_i = i for j in range(i + 1, N)..
2667번: 단지번호 붙이기 (그래프, BFS) www.acmicpc.net/problem/2667 2667번: 단지번호붙이기 과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집들의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. � www.acmicpc.net # 단지번호 붙이기 # https://www.acmicpc.net/problem/2667 (그래프, BFS) from collections import deque def bfs(x, y, area): dq = deque([(x, y)]) while dq: x, y = dq.popleft() if mp[x][y] == 0 or visited[x][y]: continue global count count += 1 ..